大家的建议是伟大的,建立您最初的表来寻找重复的,但你说你已经与所有来自9个表中的值的临时表是完美的,另一种伟大的方式如果你的数据集不是很大的话。
从描述中丢失的实际重复行的唯一步骤是使用上述重复查询来重新查询您的临时表并返回所需的行。这样做的一个好方法是通过公用表表达式,它基本上允许您在没有另一个临时表的情况下在其他查询之上构建查询。因此,使用cte并返回到临时表。
;WITH CommonTableExpression AS (
SELECT
code, name, COUNT(*)
FROM
new_table
GROUP BY
code, name
HAVING
COUNT(*) > 1;
)
SELECT t.*
FROM
new_table t
INNER JOIN CommonTableExpression c
ON t.code = c.code
和t.name = c.name
如果你想这样做是为了每个9代表的独立,而不是你的临时表。将副本放入另一个临时表并加入。
SELECT
code, name, COUNT(*)
INTO #Duplicates
FROM
new_table
GROUP BY
code, name
HAVING
COUNT(*) > 1
SELECT
l.*
FROM
leve_1_tab l
INNER JOIN #Duplicates d
ON l.Code = d.Code
AND l.name = d.name
看到每个人都喜欢union all
这里是一个与方式进行临时表和大量的union all
的I不知道这将是一个更优化的查询,虽然这样做。
;WITH cteAllCodeValues AS (
select code, name from table 1 union all
select code, name from table 2 union all
select code, name from table 3 union all
select code, name from table 4 union all
--.....)
)
, cteDuplicates AS (
SELECT code, name, RecordCount = COUNT(*)
FROM
cteAllCodeValues
GROUP BY
code, name
)
SELECT c.*
FROM
cteDuplicates d
INNER JOIN cteAllCodeValues c
ON d.code = c.code
AND d.name = c.name
我会做的方式是创建一个临时表是从不同的表中的所有值的联合,然后从那里有一个计数守则> 1。然后它是平凡找到值在他们的父表中。 –
虽然下面的@ mo2的'UNION ALL'建议正确无误。事实上,你必须为这些表做一个联合表明,也许你的模式并不好。为什么不把这些全部放在结构为'Code |的单个表中?名称|等级? – JNevill
@J你的建议对于一个新的模式来说是好的,因为它们可能是有益的,但当你把ETL设计好时,你永远不知道你在干什么!无论如何,UNION ALL很棒,能够找到重复的内容,但是mo2的alsnwer并没有实际返回重复的记录。 – Matt