我看到以下内容是删除条目重复的基本方法,但没有说明其工作原理。我看到它有效,但是我想知道它的工作方式以及评估过程。下面,我将发布代码和我的想法。我希望有人可以告诉我关于如何逐步评估的思考过程是否正确,或者如果我不在意,请有人为我分解一下。
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会创建一个结构相同但没有数据的“临时”表。
此代码然后开始将数据添加到新的空表中吗?
例如,它是否查看第一个Col1和Col2对1,1,并说“我在表中没有看到它”,因此将其添加到“ temp”表和最终结果中,然后检查下一个行,它也是1,1,然后在“临时”表中已经看到它,因此它没有添加到最终结果中。...依此类推,通过数据。
答案 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