大家的建議是偉大的,建立您最初的表來尋找重複的,但你說你已經與所有來自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