使用EXCEPT,其中1 = 0

时间:2018-12-31 20:39:15

标签: sql sql-server except

我看到以下内容是删除条目重复的基本方法,但没有说明其工作原理。我看到它有效,但是我想知道它的工作方式以及评估过程。下面,我将发布代码和我的想法。我希望有人可以告诉我关于如何逐步评估的思考过程是否正确,或者如果我不在意,请有人为我分解一下。

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

这将返回一个基本表:

Table1

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

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

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

此代码然后开始将数据添加到新的空表中吗?

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

2 个答案:

答案 0 :(得分:4)

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;

答案 1 :(得分:1)

之所以可行,是因为根据MS文档,EXCEPT的定义是

  

EXCEPT从左输入查询返回不包含的不同行   正确的输入查询输出。

此处的关键字为distinct。放置where 1 = 0会使第二个查询不返回任何结果,但是EXCEPT运算符本身会将左侧查询的行减少到distinct的行。

正如@Gordon Linoff在回答中说的那样,有一种更简单,更直接的方法来实现这一目标。

该示例在左右查询中使用同一表的事实可能会误导您,只要右查询中的值不存在于左查询中,以下查询将完成相同的事情:

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

REF:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql?view=sql-server-2017