Sql 除1=0外,使用

Sql 除1=0外,使用,sql,sql-server,except,Sql,Sql Server,Except,我看到以下内容是关于重复数据消除条目的基本方法,但没有解释其工作原理。我知道它是有效的,但我想知道它是如何工作的,以及它评估的过程。下面我将发布代码和我的想法。我希望有人能告诉我,我对如何一步一步地评估这个问题的思考过程是否正确,或者如果我不同意,有人能帮我把它分解一下吗 CREATE TABLE #DuplicateRcordTable (Col1 INT, Col2 INT) INSERT INTO #DuplicateRcordTable SELECT 1, 1 UNION ALL SEL

我看到以下内容是关于重复数据消除条目的基本方法,但没有解释其工作原理。我知道它是有效的,但我想知道它是如何工作的,以及它评估的过程。下面我将发布代码和我的想法。我希望有人能告诉我,我对如何一步一步地评估这个问题的思考过程是否正确,或者如果我不同意,有人能帮我把它分解一下吗

CREATE TABLE #DuplicateRcordTable (Col1 INT, Col2 INT)
INSERT INTO #DuplicateRcordTable
SELECT 1, 1
UNION ALL
SELECT 1, 1
UNION ALL
SELECT 1, 1
UNION ALL
SELECT 1, 2
UNION ALL
SELECT 1, 2 
UNION ALL
SELECT 1, 3
UNION ALL
SELECT 1, 4
GO
这将返回一个基本表:

然后,此代码用于排除重复项:

SELECT col1,col2
FROM #DuplicateRcordTable
EXCEPT
SELECT col1,col2
FROM #DuplicateRcordTable WHERE 1=0
我的理解是,其中1=0创建一个结构相同但没有数据的“临时”表

然后,该代码是否开始向新的空表添加数据


例如,它是否查看1,1的第一个Col1,Col2对并说“我在表中没有看到它”,因此它将其添加到“temp”表和最终结果中,然后检查下一行也是1,1,然后在“temp”中看到它表,以便不将其添加到最终结果中…等等。除此之外,

是一个删除重复项的集合操作。也就是说,它获取第一个表中不在第二个表中的所有内容,然后执行重复删除

第二组数据为空,剩下的就是删除重复数据

因此,

SELECT col1, col2
FROM #DuplicateRcordTable
EXCEPT
SELECT col1, col2
FROM #DuplicateRcordTable
WHERE 1 = 0;
相当于:

SELECT DISTINCT col1, col2
FROM #DuplicateRcordTable
SELECT col1,col2
FROM #DuplicateRcordTable
UNION
SELECT col1,col2
FROM #DuplicateRcordTable
WHERE 1 = 0;
这将是编写查询的更典型的方式

这也相当于:

SELECT DISTINCT col1, col2
FROM #DuplicateRcordTable
SELECT col1,col2
FROM #DuplicateRcordTable
UNION
SELECT col1,col2
FROM #DuplicateRcordTable
WHERE 1 = 0;

之所以有效,是因为定义了
,但根据MS文档定义为

Exception从左侧输入查询返回不同的行,这些行不是 由右输入查询输出

这里的关键词是
不同的
。放置
其中1=0
使第二个查询不返回任何结果,但是
EXCEPT
操作符本身会将左查询中的行减少为
不同的行

正如@Gordon Linoff在他的回答中所说,有一种更简单、更直接的方法来实现这一点

示例在左侧和右侧查询中使用相同的表这一事实可能会产生误导,只要右侧查询中的值不存在于左侧,以下查询将完成相同的任务:

SELECT col1, col2
FROM @DuplicateRecordTable
EXCEPT
SELECT -1, -1

REF:

但这并不能解释
1=0
是如何生效的?@DaleBurrell。1=0从第二个查询中删除所有行,因此为空。@GordonLinoff是否需要使用同一个表的Except函数两次?我理解它是如何与单独的表一起工作的,但是如果您可以只使用distinct,那么为什么要在同一个表上使用它呢。还有,为什么其中1=0是必需的?非常感谢。如果使用DISTINCT,则不使用@NickA,否则必须执行某些操作以返回空结果集(如果使用except),例如选择null、null或使用1=0方法。。。或者您可以删除WHERE子句,但这会更慢。两者都是实现不同目标的模糊方法。另一个方法是groupby,我在main中发布了它comments@NickA . . . 我不知道你的问题是什么。在某些情况下,
除外
可能对同一张表有用。除非您打算删除重复项,否则没有理由使用
。还有一种更简单的语法。group by是另一种方法(除了Gordon的DISTINCT方法更清楚),我想我遗漏了一些东西,你的答案与Gordon的不同。这是一年中的最后一天,所以我的思维不像往常那么敏锐。@scsimon-OP特别感兴趣的是为什么要使用
1=0
子句,我觉得在Gordon的总体回复中我迷失了这一点。问题不是试图找到方法来删除重复项,而是要理解为什么这种方法有效。啊,好的。我原以为他的第二句和第三句话就是为了这个,但更多的解释是没有坏处的。