Одним из «радостей» SQL является то, что один и тот же реляционный оператор (пересечение, различие и т. Д.) Может быть написан с использованием различных эквивалентных конструкций SQL (что частично объясняет, почему оптимизаторы SQL не всегда выбирают лучший план безсправка от пользователей).
Используя эти простые таблицы примеров:
WITH A AS (SELECT * FROM (VALUES (1), (2), (3)) AS T (n)),
B AS (SELECT * FROM (VALUES (3), (4), (5)) AS T (n))
Пересечение с использованием IN (<subquery>)
SELECT n
FROM A
WHERE n IN ( SELECT n FROM B ) ;
Пересечение с использованием количественного сравнения
SELECT n
FROM A
WHERE n = ANY ( SELECT n FROM B ) ;
Пересечение с использованием INTERSECT
SELECT n
FROM A
INTERSECT
SELECT n
FROM B;
Пересечение с использованием INTERSECT
, альтернативный синтаксис:
TABLE A
INTERSECT
TABLE B;
Пересечение с использованием EXISTS (<subquery>)
SELECT n
FROM A
WHERE EXISTS ( SELECT *
FROM B
WHERE B.n = A.n
);
Пересечение с использованием соединения
SELECT n
FROM A NATURAL JOIN B;
Пересечение с использованием MATCH (<subquery>)
SELECT n
FROM A
WHERE n MATCH ( SELECT n FROM B ) ;
Разница с использованием NOT IN (<subquery>)
SELECT n
FROM A
WHERE n NOT IN ( SELECT n FROM B ) ;
Разница с использованием количественного определениясравнение
SELECT n
FROM A
WHERE n <> ALL ( SELECT n FROM B ) ;
Разница с использованием EXCEPT
[MINUS
в Oracle]
SELECT n
FROM A
EXCEPT
SELECT n
FROM B;
Разница с использованием EXCEPT
, альтернативный синтаксис:
TABLE A
EXCEPT
TABLE B;
Разницаиспользование NOT EXISTS (<subquery>)
SELECT n
FROM A
WHERE NOT EXISTS ( SELECT *
FROM B
WHERE B.n = A.n
);
Разница с использованием объединения
SELECT A.n
FROM A LEFT OUTER JOIN B ON A.n = B.n
WHERE B.n IS NULL;
[В SQL нет оператора NOT MATCH
!]