1

我有两个表,其中包含一个新表和一个旧表dataset。我想看看个人记录中是否发生了什么。

旧表:

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。请注意,我的真实生活记录要大得多,需要比较许多列。进行这种比较的最佳方法是什么?

4

6 回答 6

3
select * from NewTable
except
select * from OldTable

比较和查找 SQL Server 表和数据差异的方法

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

于 2013-06-27T07:42:56.703 回答
2

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

SELECT * FROM newtable INTERSECT SELECT * FROM oldtable

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

SELECT * FROM newtable EXCEPT SELECT * FROM oldtable
于 2013-06-27T07:46:15.553 回答
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 这样的列。每当对表进行更改时更新日期时间。通过这种方式,您不需要比较所有列,只需比较日期即可。

于 2013-06-27T07:46:39.563 回答
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基于 - 的答案会更简单,更快。这将告诉您实际的差异是什么。

于 2013-06-27T07:53:02.443 回答
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
于 2013-06-27T07:56:32.650 回答
0

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

SELECT * FROM newtable EXCEPT SELECT * FROM oldtable; 

如果您确定会发生更改的列,则可以在 中指定这些列SELECT并使查询更有效率。

于 2013-06-27T07:57:30.937 回答