TSQL比较2个表

时间:2013-11-06 22:41:54

标签: sql-server tsql

我在2个数据库中有2个表。表的方案是相同的。没有时间戳或上次更新的信息。表A是一个实时表,即它在“该”程序中更新。更新记录,插入记录和删除记​​录都发生在表A中。表B是每周进行的备份。有没有一种快速的方法来比较2个表,并给我类似的结果:

I | 54
D | 55
U | 60

因此,直播表中的记录54是新的,活动表中的记录55被删除,实时表中的记录60被更新。

这需要在SQL Server 2008及更高版本中运行。

字段:id,first_name,last_name,phone,email,address_id,birth_date,last_visit,provider_id,comments

我无法控制该计划。我具有对表A的只读访问权限,对表B进行读写。

是否更容易存储每个表A的行的散列而不是表的完整副本?一般来说,我需要知道哪些行已经更新/插入和删除而没有构建时间戳。我有每周备份表,但如果需要,我可以创建一个哈希表。

3 个答案:

答案 0 :(得分:1)

使用两个完整连接,第一个用于检查id存在并识别插入和删除第二个将用于行相等。

在示例中,为了简单起见,我使用了校验和,但我建议您阅读使用它的缺点并考虑替代方法,如hashbytes或检查每列是否相等

Select id, checksum(*) hash
Into #live
From live.dbo.tbl

Select id, checksum(*) hash
Into #archive
From archive.dbo.tbl

Select l1.id,
    Case when l1.id is null then 'd'
              when a1.id is null then 'I'
              when a2.id is null then 'u' end change_type
From #live l1
Full Join #archive a1 On a1.id = l1.id
Full Join #archive a2 On a2.id = l1.id
                                    And  a2.hash = l1.hash

答案 1 :(得分:0)

我将推荐一种工具,但它不是免费的,尽管它具有完全正常运行的30天试用期。如果您要比较SQL Server表中的数据,请查看Red Gate的SQL数据比较。它并不便宜,它会多次为自己付出代价。 (如果需要比较模式,他们的SQL Compare会这样做。)

除此之外,有一个第三个表,你在那里写一个比较查询并在一个表中选择那些而不是另一个表(用一个字段表示),那些在另一个表而不是第一个,然后比较字段找到那些不同的领域 - 那也应该有效。它需要更长的时间,但如果它只是一个表,则编写该代码所需的时间应该少于您为Red Gate工具支付的时间。

答案 2 :(得分:0)

如果有一列或一组列可以唯一标识每一行,则可以编写一系列sql语句来标识插入,更新和删除。如果没有唯一的行标识符或唯一标识符(例如,使其唯一的列之一)发生更改,则为no。