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

时间:2015-04-23 08:07:04

标签: sql azure-sql-database sql-except

我在学习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如何相互不同?

编辑:This other post似乎有一些很好的信息,但似乎关注的是EXISTS而不是IN,它们有不同的用途吗?

2 个答案:

答案 0 :(得分:4)

这可能有助于您了解Except和NOT IN之间的差异

EXCEPT运算符返回左侧表中所有不同的行,这些行在右侧表中不存在。

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

答案 1 :(得分:1)

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

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