如何比较两个记录

时间:2013-06-27 07:35:27

标签: sql sql-server-2008

我有两张包含新dataset的表格。我想看看个别记录中是否发生了什么。

OLD TABLE:

ROW ID  FIELD_A FIELD_B FIELD_C
1   101 A       B       C
2   102 AA      BB      CC
3   103 AAA     BBB     CCC

新表:

ROW ID  FIELD_A FIELD_B FIELD_C
711 101 A       B       C
712 102 AAXXXXX BB      CC
713 103 AAA     BBB     CCC

预期输出

ROW ID  FIELD_A FIELD_B FIELD_C
712 102 AAXXXXX BB      CC 

我希望能够使用id =102识别记录中的差异。请注意,我的真实生活记录要大得多,需要比较许多列。这种比较的最佳方法是什么?

6 个答案:

答案 0 :(得分:3)

select * from NewTable
except
select * from OldTable

Ways to compare and find differences for SQL Server tables and data

它是一种方式,如果它是最好的,我不确定。

答案 1 :(得分:2)

如果您只想获得匹配的行,请使用以下查询

SELECT * FROM newtable INTERSECT SELECT * FROM oldtable

如果你想只获得不同的记录,请使用以下查询

SELECT * FROM newtable EXCEPT SELECT * FROM oldtable

答案 2 :(得分:0)

通过使用查询,如果列值与旧表不匹配,则下面将给出新表中的记录。您需要在查询中添加所有列

SELECT N.FIELD_A, N.FIELD_B, N.Field_C FROM NewTable N
LEFT JOIN OldTable O ON 
    O.FIELD_A = N.FIELD_A AND O.FIELD_B = N.FIELD_B AND O.FIELD_C = N.FIELD_C
WHERE O.FIELD_A IS NULL 

如果表中有更多列,可以尝试在两个表中添加类似ModifiedDate的列。只要对表进行更改,就更新日期时间。通过这种方式,您不需要比较所有列,只需比较日期。

答案 3 :(得分:0)

假设这些表具有相同的结构,此查询将为每列输出一个查询,该查询将为您提供差异的A / B比较:

SELECT 'SELECT a.' + COLUMN_NAME +
       '     , b.' + COLUMN_NAME +
       '  FROM old_table a' + 
       '     , new_table b ' +
       ' WHERE a.id = b.id ' +
       '   AND a.' + COLUMN_NAME + 
       '    <> b.' + COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME = 'old_table'
   AND COLUMN_NAME <> 'id'

您可以将此输出复制到新的查询窗口并运行它。

如果您只关心是否存在差异,那么基于EXCEPT的答案会更加简单快捷。这将告诉您实际差异是什么

答案 4 :(得分:0)

select * from oldtable a inner join newtable b on a.id=b.id
where a.fielda<> b.fielda or a.fieldb<>b.fieldb or  a.fieldc<> b.fieldc

答案 5 :(得分:0)

要查找新表中已更改的记录,只需使用以下查询

SELECT * FROM newtable EXCEPT SELECT * FROM oldtable; 

如果您确定要进行更改的列,则可以在SELECT中指定这些列,并使查询更有效。