首页 > 解决方案 > 使用 EXCEPT,其中 1=0

问题描述

我看到了以下关于删除条目的基本方法的帖子,但没有解释它是如何工作的。我看到它可以工作,但我想知道它的工作原理以及它的评估过程。下面我将发布代码,以及我的想法。我希望有人能告诉我,我关于如何逐步评估它的思考过程是否正确,或者如果我离开了,有人可以帮我分解一下。

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

这将返回一个基本表:

表格1

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

SELECT col1,col2
FROM #DuplicateRcordTable
EXCEPT
SELECT col1,col2
FROM #DuplicateRcordTable WHERE 1=0

我的理解是 1=0 创建一个结构相同但没有数据的“临时”表。

然后这段代码是否开始向新的空表添加数据?

例如,它是否查看第一个 Col1、Col2 对 1,1 并说“我在表中看不到它”,因此它将其添加到“临时”表和最终结果中,然后检查下一行是也是 1,1,然后已经在“临时”表中看到它,因此它没有添加到最终结果中......等等通过数据。

标签: sqlsql-serverexcept

解决方案


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

如果第二组为空,则剩下的就是重复删除。

因此,

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;

推荐阅读