ผสานข้อมูลโดยยึดตามหลายตาราง
ในการดําเนินการฐานข้อมูล บางครั้งจําเป็นต้องดําเนินการ SQL MERGE ตัวเลือก DML นี้ช่วยให้คุณสามารถซิงโครไนซ์สองตารางได้โดยการแทรก อัปเดต หรือลบแถวในตารางหนึ่งโดยยึดตามความแตกต่างที่พบในตารางอื่น ตารางที่กําลังถูกปรับเปลี่ยนจะเรียกว่าตารางเป้าหมาย ตารางที่ใช้เพื่อกําหนดว่าแถวใดที่จะเปลี่ยนแปลงจะเรียกว่าตารางต้นทาง
ผสาน ปรับเปลี่ยนข้อมูล โดยยึดตามเงื่อนไขอย่างน้อยหนึ่งเงื่อนไข:
- เมื่อข้อมูลต้นทางมีแถวที่ตรงกันในตารางเป้าหมาย จะสามารถอัปเดตข้อมูลในตารางเป้าหมายได้
- เมื่อข้อมูลต้นทางไม่ตรงกันกับเป้าหมาย ก็สามารถแทรกข้อมูลลงในตารางเป้าหมายได้
- เมื่อข้อมูลเป้าหมายไม่ตรงกันในแหล่งข้อมูล ก็สามารถลบข้อมูลเป้าหมายได้
ไวยากรณ์ทั่วไปของคําสั่ง MERGE จะแสดงอยู่ด้านล่าง เรากําลังจับคู่เป้าหมายและแหล่งข้อมูลบนคอลัมน์ที่ระบุ และหากมีรายการที่ตรงกันระหว่างเป้าหมายและแหล่งที่มา เราจะระบุการดําเนินการที่จะใช้กับตารางเป้าหมาย ถ้าไม่ตรงกัน เราจะระบุการดําเนินการ การดําเนินการอาจเป็นการแทรก อัปเดต หรือการลบ รหัสนี้ระบุว่ามีการดําเนินการอัปเดตเมื่อมีความตรงกันระหว่างแหล่งข้อมูลและเป้าหมาย การแทรกจะดําเนินการเมื่อมีข้อมูลในแหล่งข้อมูลที่ไม่มีข้อมูลที่ตรงกันในเป้าหมาย สุดท้าย จะดําเนินการ DELETE เมื่อมีข้อมูลในเป้าหมายที่ไม่ตรงกันในแหล่งข้อมูล มีคําสั่งผสานที่เป็นไปได้มากมาย
MERGE INTO schema_name.table_name AS TargetTbl
USING (SELECT <select_list>) AS SourceTbl
ON (TargetTbl.col1 = SourceTbl.col1)
WHEN MATCHED THEN
UPDATE SET TargetTbl.col2 = SourceTbl.col2
WHEN NOT MATCHED [BY TARGET] THEN
INSERT (<column_list>)
VALUES (<value_list>)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
คุณสามารถใช้เฉพาะองค์ประกอบของคําสั่ง MERGE ที่คุณต้องการเท่านั้น ตัวอย่างเช่น สมมติว่าฐานข้อมูลมีตารางการอัปเดตใบแจ้งหนี้ที่มีการกําหนดระยะ ซึ่งรวมถึงการแก้ไขใบแจ้งหนี้ที่มีอยู่และใบแจ้งหนี้ใหม่ผสมกัน คุณสามารถใช้ส่วนคําสั่ง WHEN MATCHED และ WHEN NOT MATCHED เพื่ออัปเดตหรือแทรกข้อมูลใบแจ้งหนี้ตามความจําเป็น
MERGE INTO Sales.Invoice as i
USING Sales.InvoiceStaging as s
ON i.SalesOrderID = s.SalesOrderID
WHEN MATCHED THEN
UPDATE SET i.CustomerID = s.CustomerID,
i.OrderDate = GETDATE(),
i.PurchaseOrderNumber = s.PurchaseOrderNumber,
i.TotalDue = s.TotalDue
WHEN NOT MATCHED THEN
INSERT (SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue)
VALUES (s.SalesOrderID, s.CustomerID, s.OrderDate, s.PurchaseOrderNumber, s.TotalDue);