我有2個大表(每個大約100-150k行)。比較2個大表(SQL Server)
這些表的結構是相同的。每個表中實體的ID也相同。
我需要一個非常快速的方式來比較這些表,並回答以下問題:
- 哪一行的字段從另一個表的行不同?
- 哪個id存在於第一個表中而哪些不存在於第二個表中?
- 哪個id存在於第二個表中並且不存在於第一個表中?
謝謝!
編輯:我需要使用C#或可能存儲過程來做到這一點比較(然後選擇用C#結果)
我有2個大表(每個大約100-150k行)。比較2個大表(SQL Server)
這些表的結構是相同的。每個表中實體的ID也相同。
我需要一個非常快速的方式來比較這些表,並回答以下問題:
謝謝!
編輯:我需要使用C#或可能存儲過程來做到這一點比較(然後選擇用C#結果)
如果你有兩個表Table1
和Table2
,他們具有相同的結構和命名的主鍵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列並比較這些列可能會更簡單。如果校驗和不同,則一列或多列不同。
SQL Data Compare是這樣做的一個很好的工具。此外,Microsoft Visual Studio SQL Server數據工具還具有數據比較功能。
我發現以下方法在比較大型數據集時表現非常好。
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;
這將顯示在一個單一的結果集的結果,如果存在具有相同的密鑰,但不同值的任何行的行會是一個在另一個上面,這樣就可以很容易地比較了哪些值之間變化表格。
如果需要,可以輕鬆將其放入存儲過程。
你嘗試過什麼嗎? –
比較大表與小表比較有什麼不同? –
150K行不是一張大桌子! 10億行是一個大表 –