[SQL] CROSS APPLY และ OUTER APPLY บน Microsoft SQL Server ใช้ทำอะไรหนอ?

CROSS APPLY

oum_nomercy
Arcadia Software Development
2 min readDec 13, 2018

--

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

--

--