ลองนึกภาพคุณมีสองตาราง / แบบสอบถามที่แตกต่างกันที่ควรจะมี / ส่งคืนข้อมูลที่เหมือนกัน คุณต้องการตรวจสอบสิ่งนี้ วิธีง่ายๆในการแสดงแถวที่ไม่ตรงกันจากแต่ละตารางเหมือนกับตัวอย่างด้านล่างคือการเปรียบเทียบทุกคอลัมน์ สมมติว่ามี 30 คอลัมน์ในตารางซึ่งหลายแห่งเป็น NULLable
เมื่อไม่มี PK หรืออาจมีการทำซ้ำต่อ PK การเข้าร่วมในคอลัมน์ PK เพียงอย่างเดียวไม่เพียงพอและจะเป็นความหายนะที่จะต้องทำการเข้าร่วมแบบเต็มโดยมีเงื่อนไขการเข้าร่วม 30 รายการที่จัดการ NULL ได้อย่างเหมาะสมรวมถึงเงื่อนไขที่น่ารังเกียจ เพื่อยกเว้นแถวที่ตรงกัน
โดยปกติแล้วคือเมื่อฉันเขียนแบบสอบถามใหม่กับข้อมูลที่ไม่มีการ unscrbed หรือไม่เข้าใจว่าปัญหานั้นเลวร้ายที่สุดและความน่าจะเป็นของ PK ที่มีอยู่ในเชิงตรรกะนั้นต่ำมาก ฉันทำสองวิธีที่แตกต่างกันเพื่อแก้ไขปัญหาแล้วเปรียบเทียบผลลัพธ์ของพวกเขาความแตกต่างที่เน้นกรณีพิเศษในข้อมูลที่ฉันไม่ทราบ
ผลลัพธ์ต้องมีลักษณะดังนี้:
Which Col1 Col2 Col3 ... Col30
------ ------ ------ ------ ------
TableA Cat 27 86 -- mismatch
TableB Cat 27 105 -- mismatch
TableB Cat 27 87 -- mismatch 2
TableA Cat 128 92 -- no corresponding row
TableB Lizard 83 NULL -- no corresponding row
หาก[Col1, Col2]
เกิดขึ้นเป็นคีย์ผสมและเราเรียงลำดับตามผลลัพธ์สุดท้ายเราจะเห็นได้ง่ายว่า A และ B มีหนึ่งแถวที่แตกต่างกันซึ่งควรจะเหมือนกันและแต่ละอันมีหนึ่งแถวที่ไม่ได้อยู่ในอีกแถวหนึ่ง
ในตัวอย่างด้านบนการเห็นแถวแรกสองครั้งไม่เป็นที่ต้องการ
นี่คือ DDL และ DML เพื่อตั้งค่าตารางตัวอย่างและข้อมูล:
CREATE TABLE dbo.TableA (
Col1 varchar(10),
Col2 int,
Col3 int,
Col4 varchar(10),
Col5 varchar(10),
Col6 varchar(10),
Col7 varchar(10),
Col8 varchar(10),
Col9 varchar(10),
Col10 varchar(10),
Col11 varchar(10),
Col12 varchar(10),
Col13 varchar(10),
Col14 varchar(10),
Col15 varchar(10),
Col16 varchar(10),
Col17 varchar(10),
Col18 varchar(10),
Col19 varchar(10),
Col20 varchar(10),
Col21 varchar(10),
Col22 varchar(10),
Col23 varchar(10),
Col24 varchar(10),
Col25 varchar(10),
Col26 varchar(10),
Col27 varchar(10),
Col28 varchar(10),
Col29 varchar(10),
Col30 varchar(10)
);
CREATE TABLE dbo.TableB (
Col1 varchar(10),
Col2 int,
Col3 int,
Col4 varchar(10),
Col5 varchar(10),
Col6 varchar(10),
Col7 varchar(10),
Col8 varchar(10),
Col9 varchar(10),
Col10 varchar(10),
Col11 varchar(10),
Col12 varchar(10),
Col13 varchar(10),
Col14 varchar(10),
Col15 varchar(10),
Col16 varchar(10),
Col17 varchar(10),
Col18 varchar(10),
Col19 varchar(10),
Col20 varchar(10),
Col21 varchar(10),
Col22 varchar(10),
Col23 varchar(10),
Col24 varchar(10),
Col25 varchar(10),
Col26 varchar(10),
Col27 varchar(10),
Col28 varchar(10),
Col29 varchar(10),
Col30 varchar(10)
);
INSERT dbo.TableA (Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11, Col12, Col13, Col14, Col15, Col16, Col17, Col18, Col19, Col20, Col21, Col22, Col23, Col24, Col25, Col26, Col27, Col28, Col29, Col30)
VALUES
('Cat', 27, 86, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Cat', 128, 92, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Porcupine', NULL, 42, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Tapir', NULL, NULL, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0')
;
INSERT dbo.TableB (Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11, Col12, Col13, Col14, Col15, Col16, Col17, Col18, Col19, Col20, Col21, Col22, Col23, Col24, Col25, Col26, Col27, Col28, Col29, Col30)
VALUES
('Cat', 27, 105, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Cat', 27, 87, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Lizard', 83, NULL, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Porcupine', NULL, 42, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0'),
('Tapir', NULL, NULL, 'a', 'b', 'c', 'd', 'e', 'f', 'g',' h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0');
SELECT ... EXCEPT ... SELECT
ด้วยSELECT
คำสั่งอื่นและเพิ่มชื่อตารางนั่นคือSELECT "table1", T1.* FROM (SELECT ... EXCEPT ... SELECT) T1
จากนั้นUNION
อีกครึ่งหนึ่งของแบบสอบถาม