Я завжди знав про 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);
може бути ефективнішим.