sql - NOT IN 与 MINUS 不会产生相同的结果

标签 sql sql-server-2008

fiddle here

SELECT DISTINCT NAME 
FROM employee MINUS 
SELECT NAME FROM salary;

SELECT DISTINCT NAME 
FROM employee 
WHERE NAME NOT IN (SELECT NAME 
                   FROM salary);

本以为结果应该是相同的,但事实并非如此。有谁解释一下为什么不行吗?

最佳答案

MINUS 不是 MS SQL Server 中支持的关键字。如果您查看执行计划,它会将 MINUS 解析为 employee 的表别名 - 它相当于:

SELECT DISTINCT [MINUS.]NAME 
FROM employee [AS] MINUS 

然后整个查询被解析为两个单独的查询:

SELECT DISTINCT [MINUS.]NAME 
FROM employee [AS] MINUS 
<-- break -->
SELECT NAME FROM salary

其中隐含术语位于括号中 ([])

SQL Fiddle 似乎没有正确显示多个结果集。

与 SQL Server 中 Oralcle 的 MINUS 等效的关键字是 EXCEPT:

SELECT DISTINCT NAME 
FROM employee EXCEPT 
SELECT NAME FROM salary;

关于sql - NOT IN 与 MINUS 不会产生相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26489303/

相关文章:

sql-server-2008 - 在不同时间使用不同参数执行相同的 SSIS 包

sql - 在 Oracle SQL 中处理日期

mysql - Django 原始查询加入多对多字段

sql - 在 PostgreSQL 中获取一个范围内的日期列表

sql - 关于重复数据删除软件的建议?

sql-server - T-SQL 用于查找事务复制中订阅服务器上是否订阅了数据库

sql-server-2008 - SQL Server 2008 R2 中的统计过程控制图

sql - 检查 SQL 表列中数据的可用性?

sql-server-2008 - 代码格式化visual studio和sql server

SQL - 复制同一表但具有不同外键 ID 的行