CROSS APPLY vs OUTER APPLY in SQL Server

CROSS APPLY vs OUTER APPLY in SQL Server

SQL Server में CROSS APPLY और OUTER APPLY क्या होता है? (With 5 Real-time Examples)

SQL Server में `APPLY` का उपयोग तब किया जाता है जब हम main table के हर row के लिए एक sub-query या table-valued function चलाना चाहते हैं।
`CROSS APPLY` और `OUTER APPLY` दोनों powerful tools हैं, लेकिन दोनों में थोड़ा फर्क होता है।

📌 CROSS APPLY vs OUTER APPLY – Basic Difference

Apply Type काम कैसा करता है? NULL Row Support
CROSS APPLY INNER JOIN जैसा ❌ NULL rows exclude
OUTER APPLY LEFT JOIN जैसा ✅ NULL rows include
ध्यान दें: अगर आपको main table की सभी rows चाहिए चाहे sub-query से match हो या नहीं, तो OUTER APPLY यूज़ करें। अगर सिर्फ matching rows चाहिए, तो CROSS APPLY यूज़ करें।

🎯 Example 1: Student-wise Exam Result Summary

Step 1: Students Table

CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    StudentName NVARCHAR(100)
);

INSERT INTO Students VALUES 
(1, 'Amit Sharma'), 
(2, 'Priya Verma'), 
(3, 'Suman Joshi'), 
(4, 'Rahul Meena');

Step 2: ExamResults Table

CREATE TABLE ExamResults (
    ResultID INT PRIMARY KEY,
    StudentID INT,
    Subject NVARCHAR(50),
    Marks INT
);

INSERT INTO ExamResults VALUES 
(1, 1, 'Math', 35),
(2, 1, 'English', 60),
(3, 2, 'Math', 40),
(4, 2, 'Science', 70),
(5, 2, 'History', 30),
(6, 4, 'Math', 45),
(7, 4, 'English', 25);

🧪 CROSS APPLY Query

SELECT 
    S.StudentName,
    R.TotalExams,
    R.Passed,
    R.Failed
FROM Students S
CROSS APPLY (
    SELECT 
        COUNT(*) AS TotalExams,
        SUM(CASE WHEN Marks >= 40 THEN 1 ELSE 0 END) AS Passed,
        SUM(CASE WHEN Marks < 40 THEN 1 ELSE 0 END) AS Failed
    FROM ExamResults E
    WHERE E.StudentID = S.StudentID
) R;

Output: केवल वही Students आएंगे जिनका Result है (Suman Joshi नहीं आएंगे)

---

🎯 Example 2: Product-wise Last 2 Orders (Using CROSS APPLY)

SELECT P.ProductName, O.OrderDate, O.Quantity
FROM Products P
CROSS APPLY (
  SELECT TOP 2 * 
  FROM Orders O 
  WHERE O.ProductID = P.ProductID 
  ORDER BY O.OrderDate DESC
) O;
---

🎯 Example 3: Employee-wise Current Address (OUTER APPLY)

SELECT 
  E.EmployeeName,
  A.City,
  A.State
FROM Employees E
OUTER APPLY (
  SELECT TOP 1 * 
  FROM Addresses A 
  WHERE A.EmployeeID = E.EmployeeID 
  ORDER BY A.AddressID DESC
) A;
---

🎯 Example 4: Customer with Last Support Ticket (CROSS APPLY)

SELECT 
  C.CustomerName,
  T.TicketTitle,
  T.CreatedDate
FROM Customers C
CROSS APPLY (
  SELECT TOP 1 * 
  FROM Tickets T 
  WHERE T.CustomerID = C.CustomerID 
  ORDER BY CreatedDate DESC
) T;
---

🎯 Example 5: Department-wise Highest Paid Employee (CROSS APPLY)

SELECT 
  D.DepartmentName,
  E.EmployeeName,
  E.Salary
FROM Departments D
CROSS APPLY (
  SELECT TOP 1 * 
  FROM Employees E 
  WHERE E.DepartmentID = D.DepartmentID 
  ORDER BY E.Salary DESC
) E;

APPLY (CROSS APPLY / OUTER APPLY) का असली जलवा Subqueries और Top-N selections में ही नज़र आता है। नीचे मैं आपको पूरे detail में समझाता हूँ: कैसे APPLY Subqueries या Top-N selection को powerful बना देता है।

✅ क्यों APPLY ज़रूरी है Subqueries या Top-N में?

🔹 JOINs से Subqueries नहीं चला सकते जो correlated हों और row-wise काम करें।
Traditional INNER JOIN, LEFT JOIN सिर्फ static joins होते हैं।
लेकिन जब हम हर row के लिए dynamic data चाहिए — जैसे Top N records per row, या aggregates per row, तो वहाँ JOINs fail हो जाते हैं।
➡️ यही काम APPLY कर सकता है — वो भी efficiently और elegantly!

🔍 Real-Life Example: हर Customer के Top 1 Last Order की Details चाहिए



SELECT 
    C.CustomerName,
    O.OrderID,
    O.OrderDate,
    O.TotalAmount
FROM Customers C
CROSS APPLY (
    SELECT TOP 1 *
    FROM Orders O
    WHERE O.CustomerID = C.CustomerID
    ORDER BY O.OrderDate DESC
) O

⛔ बिना APPLY के यह query JOIN से संभव नहीं होती क्योंकि आप एक row-per-customer चाहते हैं, लेकिन Orders table में Multiple rows होती हैं।

APPLY सिर्फ SQL Server और Azure SQL में available है (MySQL/PostgreSQL में नहीं)

✅ Summary

  • CROSS APPLY तब यूज़ करें जब आपको केवल वही rows चाहिए जिनका matching data हो।
  • OUTER APPLY तब यूज़ करें जब आपको master table की सभी rows चाहिए चाहे detail मिले या ना मिले।
  • Subqueries या Top-N selection में APPLY बहुत useful है।
उम्मीद है आपको APPLY के यह examples और अंतर अच्छे से समझ में आया होगा। कोई सवाल हो तो कमेंट करें!

Post a Comment

0 Comments