2016-11-15 66 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; 

这将显示在一个单一的结果集的结果,如果存在具有相同的密钥,但不同值的任何行的行会是一个在另一个上面,这样就可以很容易地比较了哪些值之间变化表格。

如果需要,可以轻松将其放入存储过程。