top of page

การใช้ 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

Recent Posts
Archive
Search By Tags
Follow Us
  • Facebook Basic Square
  • Twitter Basic Square
  • Google+ Basic Square
bottom of page