提问人:melnynet 提问时间:11/15/2016 最后编辑:melnynet 更新时间:11/15/2016 访问量:5353
比较 2 个大表 (SQL Server) [重复]
Compare 2 big tables (SQL Server) [duplicate]
问:
我有 2 张大桌子(每张桌子大约有 100-150k 行)。
这些表的结构是相同的。实体的 ID 在每个表中也相同。
我需要一种非常快速的方法来比较这些表格并回答以下问题:
- 哪一行的字段与其他表的行不同?
- 哪些 ID 存在于第一个表中,哪些 ID 不存在于第二个表中?
- 哪些 ID 存在于第二个表中,哪些 ID 不存在于第一个表中?
谢谢!
编辑:我需要使用 C# 或存储过程进行此比较(然后通过 c# 选择结果)
答:
1赞
Peter Mourfield
11/15/2016
#1
SQL Data Compare 是执行此操作的绝佳工具。此外,Microsoft Visual Studio SQL Server Data Tools 还具有数据比较功能。
评论
0赞
Alan B
3/8/2019
SSDT 仅适用于具有主键 FWIW 的表。
2赞
John Wu
11/15/2016
#2
如果您有两个表,并且它们具有相同的结构和主键,则可以使用以下 SQL:Table1
Table2
ID
--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赞
mendosi
11/15/2016
#3
我发现以下方法在比较大型数据集时表现非常好。
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;
这将在单个结果集中显示结果,如果有任何行具有相同的键但不同的值,则这些行将一个在另一个行之上,以便您可以轻松地比较表之间的哪些值发生了更改。
如果需要,可以很容易地将其放入存储过程中。
评论