CROSS APPLY vs OUTER APPLY in SQL Server (with Live Examples)

CROSS APPLY vs OUTER APPLY in SQL Server (with Live Examples)

CROSS APPLY vs OUTER APPLY in SQL Server (with Live Examples)

SQL Server में CROSS APPLY और OUTER APPLY powerful operators हैं जो हमें Master-Detail records के साथ flexible तरीके से काम करने की सुविधा देते हैं।

मुख्य फर्क:
CROSS APPLY ➝ INNER JOIN जैसा (सिर्फ matching rows)
OUTER APPLY ➝ LEFT JOIN जैसा (non-matching rows भी दिखते हैं)

🧪 Example 1: OUTER APPLY – Student Exam Summary

यह example हर student को दिखाता है, चाहे उसने exam दिया हो या नहीं।

-- 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, 'Rahul Meena'),
(4, 'Suman Joshi'); -- इसने कोई exam नहीं दिया

-- 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', 45),
(2, 1, 'English', 38),
(3, 2, 'Math', 72),
(4, 2, 'Science', 65),
(5, 2, 'English', 33),
(6, 3, 'Math', 20),
(7, 3, 'Science', 50);

-- Step 3: OUTER APPLY Query
SELECT 
    S.StudentName,
    ISNULL(R.TotalExams, 0) AS Total_Exams,
    ISNULL(R.Passed, 0) AS Passed_Exams,
    ISNULL(R.Failed, 0) AS Failed_Exams
FROM Students S
OUTER 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:

StudentNameTotal_ExamsPassed_ExamsFailed_Exams
Amit Sharma211
Priya Verma321
Rahul Meena211
Suman Joshi000

🧪 Example 2: CROSS APPLY – Latest Order Per Customer

यह example सिर्फ उन customers को दिखाता है जिन्होंने कम से कम 1 order दिया है।

-- Step 1: Customers Table
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    CustomerName NVARCHAR(100)
);

INSERT INTO Customers VALUES
(1, 'Amit Kumar'),
(2, 'Priya Mehta'),
(3, 'Rahul Jain');

-- Step 2: Orders Table
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    Amount DECIMAL(10, 2)
);

INSERT INTO Orders VALUES
(101, 1, '2025-07-01', 1500.00),
(102, 1, '2025-07-10', 1800.00),
(103, 2, '2025-07-05', 2000.00);

-- Step 3: CROSS APPLY Query
SELECT 
    C.CustomerName,
    O.OrderID,
    O.OrderDate,
    O.Amount
FROM Customers C
CROSS APPLY (
    SELECT TOP 1 OrderID, OrderDate, Amount
    FROM Orders O
    WHERE O.CustomerID = C.CustomerID
    ORDER BY OrderDate DESC
) O;

📌 Output:

CustomerNameOrderIDOrderDateAmount
Amit Kumar1022025-07-101800.00
Priya Mehta1032025-07-052000.00

🧪 Example 3: CROSS APPLY – Last 3 Orders Per Product

-- Step 1: Products Table
CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName NVARCHAR(100)
);

INSERT INTO Products VALUES
(1, 'Mobile'),
(2, 'Laptop'),
(3, 'Headphones');

-- Step 2: OrderDetails Table
CREATE TABLE OrderDetails (
    OrderDetailID INT PRIMARY KEY,
    ProductID INT,
    OrderID INT,
    OrderDate DATE,
    Quantity INT
);

INSERT INTO OrderDetails VALUES
(1, 1, 101, '2025-07-01', 2),
(2, 1, 102, '2025-07-03', 1),
(3, 1, 103, '2025-07-08', 3),
(4, 2, 104, '2025-07-02', 1);

-- Step 3: CROSS APPLY Query
SELECT 
    P.ProductName,
    O.OrderID,
    O.OrderDate,
    O.Quantity
FROM Products P
CROSS APPLY (
    SELECT TOP 3 OrderID, OrderDate, Quantity
    FROM OrderDetails O
    WHERE O.ProductID = P.ProductID
    ORDER BY OrderDate DESC
) O;

📌 Output:

ProductNameOrderIDOrderDateQuantity
Mobile1032025-07-083
Mobile1022025-07-031
Mobile1012025-07-012
Laptop1042025-07-021

📚 Summary – कब क्या Use करें?

ConditionUse
सिर्फ matching records चाहिएCROSS APPLY
All master rows चाहिए (चाहे detail हो या नहीं)OUTER APPLY

आशा है आपको CROSS APPLY और OUTER APPLY के बीच का फर्क और उनका उपयोग समझ में आया होगा।

Post a Comment

0 Comments