使用 EXCEPT where 1=0
Using EXCEPT where 1=0
我看到以下 posted 介绍了删除重复项的基本方法,但没有解释其工作原理。我看到它有效,但我想知道它的工作原理和评估过程。下面我将post代码,和我的想法。我希望有人能告诉我我关于如何逐步评估的思考过程是否正确,或者如果我不对,有人可以为我分解一下。
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
这个returns一个基本的table:
那么这段代码就是用来排除重复的:
SELECT col1,col2
FROM #DuplicateRcordTable
EXCEPT
SELECT col1,col2
FROM #DuplicateRcordTable WHERE 1=0
我的理解是 1=0 会创建一个结构相同但没有数据的 "temp" table。
此代码是否开始向新的空 table 添加数据?
例如,它是否查看第一个 Col1、Col2 对 1,1 并说 "I don't see it in the table",因此它将其添加到 "temp" table 和最终结果,然后检查下一行也是 1,1,然后在 "temp" table 中已经看到它,因此它不会添加到最终结果中....等等通过数据。
EXCEPT
是一个删除重复项的集合操作。也就是说,它获取第一个 table 中不在第二个中的所有内容,然后进行重复删除。
第二组为空,剩下的就是重复删除。
因此,
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;
这个工作的原因是 EXCEPT
的定义,根据 MS 文档是
EXCEPT returns distinct rows from the left input query that aren't
output by the right input query.
这里的关键词是distinct
。放置 where 1 = 0
使第二个查询 return 没有结果,但是 EXCEPT
运算符本身然后将左侧查询中的行减少到 distinct
.
正如@Gordon Linoff 在他的回答中所说,有一种更简单、更直接的方法可以实现这一点。
该示例在左侧和右侧查询中使用相同的 table 这一事实可能会产生误导,只要右侧查询中的值不存在,以下查询将完成相同的事情左边:
SELECT col1, col2
FROM @DuplicateRecordTable
EXCEPT
SELECT -1, -1
我看到以下 posted 介绍了删除重复项的基本方法,但没有解释其工作原理。我看到它有效,但我想知道它的工作原理和评估过程。下面我将post代码,和我的想法。我希望有人能告诉我我关于如何逐步评估的思考过程是否正确,或者如果我不对,有人可以为我分解一下。
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
这个returns一个基本的table:
那么这段代码就是用来排除重复的:
SELECT col1,col2
FROM #DuplicateRcordTable
EXCEPT
SELECT col1,col2
FROM #DuplicateRcordTable WHERE 1=0
我的理解是 1=0 会创建一个结构相同但没有数据的 "temp" table。
此代码是否开始向新的空 table 添加数据?
例如,它是否查看第一个 Col1、Col2 对 1,1 并说 "I don't see it in the table",因此它将其添加到 "temp" table 和最终结果,然后检查下一行也是 1,1,然后在 "temp" table 中已经看到它,因此它不会添加到最终结果中....等等通过数据。
EXCEPT
是一个删除重复项的集合操作。也就是说,它获取第一个 table 中不在第二个中的所有内容,然后进行重复删除。
第二组为空,剩下的就是重复删除。
因此,
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;
这个工作的原因是 EXCEPT
的定义,根据 MS 文档是
EXCEPT returns distinct rows from the left input query that aren't output by the right input query.
这里的关键词是distinct
。放置 where 1 = 0
使第二个查询 return 没有结果,但是 EXCEPT
运算符本身然后将左侧查询中的行减少到 distinct
.
正如@Gordon Linoff 在他的回答中所说,有一种更简单、更直接的方法可以实现这一点。
该示例在左侧和右侧查询中使用相同的 table 这一事实可能会产生误导,只要右侧查询中的值不存在,以下查询将完成相同的事情左边:
SELECT col1, col2
FROM @DuplicateRecordTable
EXCEPT
SELECT -1, -1