Есть ли способ переписать операторы EXCEPT в операторы NOT IN в SQL?

Я несколько недель изучаю SQL и только что выполнил задание по домашнему заданию об использовании IN и NOT IN. Мне удалось получить правильный ответ, однако я использовал предложение EXCEPT, которое нам пока не разрешено использовать. Из того, что я могу сказать, EXCEPT и NOT IN - очень похожие операторы в SQL, но я не могу понять, в чем разница. Вот общий формат моего запроса:

SELECT *
FROM table
WHERE x IN (
    SELECT x
    /* ... some subquery*/
    EXCEPT
    SELECT x
    /* ... some other subquery*/ 
)

Есть ли способ переписать этот общий запрос без использования оператора EXCEPT? Чем EXCEPT и NOT IN отличаются друг от друга в целом?

Редактировать: Этот другой пост, кажется, содержит некоторую полезную информацию, но, похоже, он сосредоточен на СУЩЕСТВУЮЩЕМ, а не на В, что имеет разные цели, не так ли?

2 ответа

Решение

Это может помочь вам понять разницу между исключением и не в

Оператор EXCEPT возвращает все отдельные строки из левой таблицы, которая не существует в правой таблице.

С другой стороны, "NOT IN" вернет все строки из левой таблицы, которых нет в правой таблице, но не удалит дублирующиеся строки из результата.

SQL является декларативным языком. В результате есть много конструкций, которые могут переводиться в одно и то же дерево реляционной алгебры / план выполнения. Например, вы можете указать внутреннее соединение, используя INNER JOIN или CROSS JOIN + WHERE или, + WHERE или LEFT / RIGHT JOIN + WHERE.

EXCEPT / INTERSECT - операторы установки, а IN/NOT IN - предикаты. Рассмотрим ваш пример,

SELECT *
FROM table
WHERE x IN (
    SELECT x
    /* ... some subquery*/
    EXCEPT
    SELECT x
    /* ... some other subquery*/ 
)

Это можно записать с помощью IN/NOT IN, например:

SELECT *
FROM table as t1
WHERE t1.x IN (
    SELECT t2.x
    FROM t2
    WHERE t2.x NOT IN (
                      SELECT t3.x
                      FROM t3
    )
)

Теперь с точки зрения синтаксиса они означают одно и то же, но семантически они могут не давать одинаковых результатов. Например, если столбец X имеет значение NULL, то NOT IN будет давать разные результаты.

Наконец, для простого случая, если вы посмотрите на план выполнения в SQL Server Management Studio для этих двух запросов, вы обнаружите, что они используют сходные стратегии планов / объединений. Это связано с тем, что SQL Server преобразует синтаксис в реляционное дерево, оптимизированное для создания плана выполнения. После этого перевода окончательный план может быть идентичным для разных запросов.

Другие вопросы по тегам