Я всегда знал об UNIONоператоре в SQL, но только недавно обнаружил, что были и другие операторы множеств, INTERSECTи EXCEPT. Я не смог найти оператора, который выполняет четвертый оператор большого набора, симметричную разность (например, противоположность INTERSECT.)
Похоже, я могу получить желаемый результат, используя что-то вроде
SELECT Field FROM A UNION SELECT Field FROM B
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
(при условии, что я правильно понял приоритет) или с помощью анти-полного объединения:
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
Но оба они выглядят как довольно интенсивные запросы, особенно по сравнению с тремя другими основными операциями над множествами. Есть ли в SQL симметричная разностная операция, и я просто не могу найти ее в документации? Или есть «канонический» способ реализовать его в T-SQL?
FULL JOINможет быть более эффективным. Тестирование может выявить, что лучше. И, конечно же, если требуется больше / разных столбцов в каждой таблице, моё решение нелегко расширить.
(a EXCEPT b) UNION ALL (b EXCEPT a);может быть более эффективным.