Zawsze wiedziałem o UNIONoperatorze w SQL, ale dopiero niedawno odkryłem, że istnieją inne operatory zestawu INTERSECTi EXCEPT. Nie udało mi się znaleźć operatora, który wykonałby czwarty operator dużego zestawu, różnicę symetryczną (np. Odwrotnie INTERSECT.)
Wygląda na to, że mogę uzyskać pożądaną moc wyjściową za pomocą czegoś takiego
SELECT Field FROM A UNION SELECT Field FROM B
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
(zakładając, że mam pierwszeństwo), lub wykonując anti-full-join:
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
Ale oba z nich wyglądają na dość intensywne zapytania, szczególnie w porównaniu do pozostałych trzech podstawowych operacji zestawu. Czy w SQL jest operacja różnicy symetrycznej i po prostu nie mogę jej znaleźć w dokumentacji? A może istnieje „kanoniczny” sposób na wdrożenie go w T-SQL?
FULL JOINmoże być bardziej wydajny. Testy mogą ujawnić, który jest najlepszy. I oczywiście, jeśli potrzeba więcej / różnych kolumn z każdej tabeli, moje rozwiązanie nie jest łatwe do rozszerzenia.
(a EXCEPT b) UNION ALL (b EXCEPT a);może być bardziej wydajny.