2016-06-14 43 views
0

之间重复的领域我必须每9个表格与价值像查询找到9个表

Level_1_tab 

Code Name 

ae1 hdgdgd 
ae2 dhdh 


level_2_tab 

code Name 
2  jfjfjf 
3  fkfjfjf 

同样level_3_tab , level_4_tab, level_5表等等,等等,直到level_9_tab。

我将代码列插入到新表中并检查重复项。

SELECT 
     code, name, COUNT(*) 
    FROM 
     new_table 
    GROUP BY 
     code, name 
    HAVING 
     COUNT(*) > 1; 

我可以写一个查询并比较这9个表的代码列并检查重复吗?应该检索所有具有重复代码值的行

+0

我会做的方式是创建一个临时表是从不同的表中的所有值的联合,然后从那里有一个计数守则> 1。然后它是平凡找到值在他们的父表中。 –

+0

虽然下面的@ mo2的'UNION ALL'建议正确无误。事实上,你必须为这些表做一个联合表明,也许你的模式并不好。为什么不把这些全部放在结构为'Code |的单个表中?名称|等级? – JNevill

+0

@J你的建议对于一个新的模式来说是好的,因为它们可能是有益的,但当你把ETL设计好时,你永远不知道你在干什么!无论如何,UNION ALL很棒,能够找到重复的内容,但是mo2的alsnwer并没有实际返回重复的记录。 – Matt

回答

1

您可以对9个表执行union all并在其上运行相同的查询。 UNION ALL的

select code, name, count(*) from 
    (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 
    .....) 
group by code, name 
having count(*) > 1; 
+0

这不会返回实际的重复行,它只会返回哪些代码有重复 – Matt

+0

如果只需要两列,那么它并不重要。除非OP需要找出哪些表具有它们。然后,您可以手动将表名添加到联合查询中,然后按照您的建议重新加入。 – mo2

+0

因为他的代码肯定会返回已经重复的东西,所以我想我正在阅读他然后想要返回实际上重复的所有记录。我想这是不完全清楚,虽然我们之间我认为我们现在杀死了答案:) – Matt

0

大家的建议是伟大的,建立您最初的表来寻找重复的,但你说你已经与所有来自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 
+0

你可以从建议的UNION子查询加入,而无需编写一个CTE,但... 6 6,一个,半打另一个。如果这是我坚持这个不好的模式,我会将表名添加到UNION作为第三列,所以我可以走回到重复来自哪些表,这将是更多的一步。 – JNevill

+0

@JNevill同意你的模式,并添加表名,即使是临时表,他已经添加它也会有好处。就cte而言,我为了读取能力而对子查询进行了修改,而我不想再次输入所有这些union alls :) – Matt