比较 2 个大表 (SQL Server) [重复]

Compare 2 big tables (SQL Server) [duplicate]

提问人:melnynet 提问时间:11/15/2016 最后编辑:melnynet 更新时间:11/15/2016 访问量:5353

问:

我有 2 张大桌子(每张桌子大约有 100-150k 行)。

这些表的结构是相同的。实体的 ID 在每个表中也相同。

我需要一种非常快速的方法来比较这些表格并回答以下问题:

  1. 哪一行的字段与其他表的行不同?
  2. 哪些 ID 存在于第一个表中,哪些 ID 不存在于第二个表中?
  3. 哪些 ID 存在于第二个表中,哪些 ID 不存在于第一个表中?

谢谢!

编辑:我需要使用 C# 或存储过程进行此比较(然后通过 c# 选择结果)

C# .NET SQL Server 性能 比较

评论

0赞 Lei Yang 11/15/2016
与小桌子相比,大桌子有什么区别吗?
6赞 Mitch Wheat 11/15/2016
150K行不是一张大桌子!10 亿行是一个大表
0赞 Antonín Lejsek 11/15/2016
目前尚不清楚您的期望结果。您能提供输入和期望输出的示例吗?

答:

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:Table1Table2ID

--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;

这将在单个结果集中显示结果,如果有任何行具有相同的键但不同的值,则这些行将一个在另一个行之上,以便您可以轻松地比较表之间的哪些值发生了更改。

如果需要,可以很容易地将其放入存储过程中。