我有两张包含新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
识别记录中的差异。请注意,我的真实生活记录要大得多,需要比较许多列。这种比较的最佳方法是什么?
答案 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
中指定这些列,并使查询更有效。