在SQL中有没有办法将EXCEPT语句重写为NOT IN语句?

在SQL中有没有办法将EXCEPT语句重写为NOT IN语句?,sql,azure-sql-database,sql-except,Sql,Azure Sql Database,Sql Except,我已经开始学习SQL了几周,刚刚完成了一个关于在中使用和不在中使用的家庭作业问题。我设法得到了正确的答案,但是,我使用了EXCEPT子句,我们实际上还不允许使用它。据我所知,除了和不在外,SQL中的语句非常相似,但我不明白它们的区别是什么。以下是我的查询的一般格式: SELECT * FROM table WHERE x IN ( SELECT x /* ... some subquery*/ EXCEPT SELECT x /* ... some oth

我已经开始学习SQL了几周,刚刚完成了一个关于在中使用和不在中使用的家庭作业问题。我设法得到了正确的答案,但是,我使用了EXCEPT子句,我们实际上还不允许使用它。据我所知,除了和不在外,SQL中的语句非常相似,但我不明白它们的区别是什么。以下是我的查询的一般格式:

SELECT *
FROM table
WHERE x IN (
    SELECT x
    /* ... some subquery*/
    EXCEPT
    SELECT x
    /* ... some other subquery*/ 
)
有没有办法不使用EXCEPT语句重写这个常规查询?一般来说,除了和不除了有什么区别


编辑:似乎有一些很好的信息,但它似乎关注的是存在和不存在,它们有不同的目的,不是吗?

这可能有助于您理解除了和不存在的区别

运算符从左侧表返回右侧表中不存在的所有不同行


另一方面,“notin”将返回左侧表中不在右侧表中的所有行,但不会从结果中删除重复行

这可能有助于您理解除外和不在中的区别

运算符从左侧表返回右侧表中不存在的所有不同行


另一方面,“notin”将返回左侧表中不在右侧表中的所有行,但不会从结果中删除重复行

SQL是一种声明性语言。因此,有许多构造可以转换为相同的关系代数树/执行计划。例如,可以使用内部联接或交叉联接+WHERE或、+WHERE或左/右联接+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-like编写:

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可为空,则NOT IN将产生不同的结果


最后,对于简单的情况,如果您在SQLServerManagementStudio中查看这两个查询的执行计划,您会发现它们使用类似的计划/连接策略。这是因为SQLServer将语法转换为关系树,该关系树经过优化以生成执行计划。翻译后,对于不同的查询,最终的计划可能是相同的。

SQL是一种声明性语言。因此,有许多构造可以转换为相同的关系代数树/执行计划。例如,可以使用内部联接或交叉联接+WHERE或、+WHERE或左/右联接+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-like编写:

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可为空,则NOT IN将产生不同的结果


最后,对于简单的情况,如果您在SQLServerManagementStudio中查看这两个查询的执行计划,您会发现它们使用类似的计划/连接策略。这是因为SQLServer将语法转换为关系树,该关系树经过优化以生成执行计划。翻译后,对于不同的查询,最终的计划可能是相同的。

这很有意义!非常感谢你!这是有道理的!非常感谢你!