我有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亿行是一个大表 –