Zawsze wiedziałem o UNION
operatorze w SQL, ale dopiero niedawno odkryłem, że istnieją inne operatory zestawu INTERSECT
i 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?
sql-server
t-sql
KutuluMike
źródło
źródło
(a EXCEPT b) UNION ALL (b EXCEPT a);
może być bardziej wydajny.FULL JOIN
moż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.Odpowiedzi:
Wszystkie operatory zestawu są tłumaczone na sprzężenia lub operatory podobne do łączenia. Możesz to zobaczyć w planie zapytań.
Z tego powodu pełne połączenie zewnętrzne, które tam masz, jest najbardziej wydajne, co możesz zrobić. Pomijając oczywiście, miejmy nadzieję, rzadką sytuację, w której optymalizator wybiera zły plan, a przepisywanie tekstu działa lepiej dzięki szczęściu. To zawsze może się zdarzyć.
źródło
SELECT Id FROM A WHERE <stuff> EXCEPT Select Id FROM A WHERE <other stuff>
i uzyskać jedną listęId
. Nie mogę wymyślić, jak to zrobić z pełnym złączeniem ... czy muszę po prostu poradzić sobie z posiadaniem dwóch zestawówId
kolumn i zjednoczeniem ich z sobą?ISNULL(a.Col, b.Col) AS Col
. Zawiń to w pochodną tabelę lub CTE i możesz użyć „złożonego” zestawu wyników do dalszej operacji na nim. (Przy okazji, zgadzam się, że operator różnicy symetrycznej powinien istnieć.)Myślę, że to całkiem dobre rozwiązanie. Używa połączenia wszystkich dwóch wyborów z podkwerendami Nieistniejące. Lepsze niż łączenie Union i Wyjątek, ponieważ możesz uwzględnić pola, które nie pasują do projekcji.
źródło