2016-11-15 82 views
-3

我有2個大表(每個大約100-150k行)。比較2個大表(SQL Server)

這些表的結構是相同的。每個表中實體的ID也相同。

我需要一個非常快速的方式來比較這些表,並回答以下問題:

  1. 哪一行的字段從另一個表的行不同?
  2. 哪個id存在於第一個表中而哪些不存在於第二個表中?
  3. 哪個id存在於第二個表中並且不存在於第一個表中?

謝謝!

編輯:我需要使用C#或可能存儲過程來做到這一點比較(然後選擇用C#結果)

+1

你嘗試過什麼嗎? –

+0

比較大表與小表比較有什麼不同? –

+5

150K行不是一張大桌子! 10億行是一個大表 –

回答

2

如果你有兩個表Table1Table2,他們具有相同的結構和命名的主鍵ID你可以使用這個SQL:

--Find rows that exist in both Table1 and Table2 
SELECT * 
FROM Table1 
WHERE EXISTS (SELECT 0 FROM Table2 WHERE Table1.ID = Table2.ID) 

--Find rows that exist in Table1 but not Table2 
SELECT * 
FROM Table1 
WHERE NOT EXISTS (SELECT 0 FROM Table2 WHERE Table1.ID = Table2.ID) 

如果你想比較,發現在一列不同行或另一個,這是有點棘手。您可以編寫SQL來自行檢查每個列,但向兩個表中添加臨時CHECKSUM列並比較這些列可能會更簡單。如果校驗和不同,則一列或多列不同。

1

SQL Data Compare是這樣做的一個很好的工具。此外,Microsoft Visual Studio SQL Server數據工具還具有數據比較功能。

0

我發現以下方法在比較大型數據集時表現非常好。

http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx

基本上的兩個數據源UNION ALL然後它們聚集並返回不具有在其他表中的相同匹配的行只行。

With unionCTE As (
    Select 'TableA' As TableName, col1, col2 
     From TableA 
    Union All 
    Select 'TableB', col1, col2 
     From TableB) 
Select Max(TableName), col1, col2 
    From unionCTE 
    Group By col1, col2 
    Having Count(*) = 1 
    Order By col1, col2, TableName; 

這將顯示在一個單一的結果集的結果,如果存在具有相同的密鑰,但不同值的任何行的行會是一個在另一個上面,這樣就可以很容易地比較了哪些值之間變化表格。

如果需要,可以輕鬆將其放入存儲過程。