Ben her zaman UNIONSQL operatör hakkında biliyordum , ama sadece son zamanlarda başka set operatörleri olduğunu keşfetti INTERSECTve EXCEPT. Dördüncü büyük set operatörünü, simetrik farkı (örneğin tersini INTERSECT) yapan bir operatör bulamadım .
Gibi bir şey kullanarak istenen çıktıyı alabilirim gibi görünüyor
SELECT Field FROM A UNION SELECT Field FROM B
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
(önceliği doğru bulduğumu varsayarak) veya tam bir anti-birleştirme yaparak:
SELECT A.Field, B.Field
FROM A
FULL JOIN B ON B.Id = A.Id
WHERE B.Id IS NULL OR A.Id IS NULL
Ancak her ikisi de, özellikle diğer üç temel küme işlemine kıyasla oldukça yoğun sorgular gibi görünüyor. SQL'de simetrik bir fark işlemi var mı ve bunu belgelerde bulamıyorum? Yoksa T-SQL'de uygulamak için "kanonik" bir yolu var mı?
FULL JOINdaha verimli olabileceğini kabul ediyorum . Test hangisinin daha iyi olduğunu ortaya çıkarabilir. Ve elbette, her tablodan daha fazla / farklı sütun gerekiyorsa, çözümüm kolayca genişletilemez.
(a EXCEPT b) UNION ALL (b EXCEPT a);daha verimli olabilir.