2016-06-14 39 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