การใช้ CROSS APPLY และ OUTER APPLY ใน Microsoft SQL Server
CROSS APPLY
Cross Apply นั้นเป็น function เฉพาะของ MS SQL Server ซึ่งหลายคนอาจจะยังไม่เคยใช้ Statement นี้ ซึ่ง Cross Apply จะอนุญาตให้เรียบเรียงข้อมูลของ sub table โดยใช้ key ของ Table หลักเป็นเงื่อนไขในการ where clause โดยที่ sub table ยังสามารถใช้ Top หรือ Order by เพื่อสร้างรูปแบบข้อมูลที่เรียกว่า first from many row selection/retrieval ได้
ตัวอย่าง Order Table ที่จะใช้ Query ข้อมูล
รูปแบบ Statement
SELECT o1.OrderID, o1.OrderDate, ca.OrderID AS NextOrder,
ca.OrderDate AS NextOrderDate, CustomerID,
DATEDIFF(DAY, o1.OrderDate,ca.OrderDate) DaysToNextOrder
FROM Orders AS o1
CROSS APPLY
(SELECT TOP 1 o.OrderDate, o.OrderID
FROM Orders AS o
WHERE o.customerID = o1.customerID
AND o.OrderID > o1.OrderID
ORDER BY OrderID) AS ca
ORDER BY CustomerID, o1.OrderID;
Result
จะเห็นว่าข้อมูลที่ select ออกมา จะแสดงเป็นแบบ sequence โดยที่แสดงค่า Order Date ที่มากกว่าค่าตัวเองมา 1 step ในรูปคือ Next Order Date ที่ข้อมูล Order Od เดียวกันเนื่องจากเราใช้ Top 1 ใน Cross Apply นั่นเอง
OUTER APPLY
OUTER APPLY มีรูปแบบเหมือนกับ LEFT JOIN ซึ่งอธิบายง่ายๆ คือหากไม่มีข้อมูลใน sub Table ก็จะแสดงค่า NULL ออกมา ดังตัวอย่างต่อไปนี้
รูปแบบ Statement
SELECT o1.OrderID, o1.OrderDate, ca.OrderID AS NextOrder,
ca.OrderDate AS NextOrderDate, CustomerID,
DATEDIFF(DAY, o1.OrderDate,ca.OrderDate) DaysToNextOrder
FROM Orders AS o1
OUTER APPLY
(SELECT TOP 1 o.OrderDate, o.OrderID
FROM Orders AS o
WHERE o.customerID = o1.customerID
AND o.OrderID > o1.OrderID
ORDER BY OrderID) AS ca
ORDER BY CustomerID, o1.OrderID;
Result
ความแตกต่างระหว่าง CROSS APPLY และ OUTER APPLY
CROSS APPLY จะมีลักษณะคล้ายกับ INNER JOIN คือข้อมูลต้อง Match กันตามเงื่อนไขของ where caules ทั้ง 2 Table ส่วน OUTER APPLY ลักษณะจะคล้ายกับ LEFT JOIN โดยจะยึดข้อมูลฝั่งซ้ายหรือ Main Table เป็นหลัก
สามารถศึกษาเพิ่มเติมได้ที่ :
https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/
https://www.ptr.co.uk/blog/sql-server-sql-cross-apply-statement