当我遇到两个几乎相同的表中的数据差异时,我需要生成一个报告。 (我正在使用Informix数据库版本11.70。)
例如:我的live table有列:
直播
Name ID TRN
XXX 1 10
档案:
Date Name ID TRN
01/01/2018 XXX 1 10
31/12/2017 XXX 1 11
29/12/2017 XXX 1 12
Archive表具有相同的列集,只是它还有一个日期列,因此我可以看到实时表在给定日期的值。
与归档数据相比,如何编写查询以查找实时数据中的值是否发生更改。
我尝试了这个查询:
select name,id,TRN from live
union
select name,id,TRN from archive
虽然它有效但是有更好/更快的方式,因为在报告中我需要同时拥有实时数据和历史价值的差异。
报告中的预期结果:
Live:
01/01/2018|XXX|1|10
Archive
31/12/2017|XXX|1|11
29/12/2017|XXX|1|12
答案 0 :(得分:1)
您可以考虑:
SELECT "Unarchived" AS source, NULL::DATE AS date, l.name, l.id, l.trn
FROM live AS l
WHERE NOT EXISTS(
SELECT * FROM archive AS a
WHERE l.name = a.name AND l.id = a.id AND l.trn = a.trn
)
这显示了Archive中与Live中的每一行匹配的行 显示存档中的每一行,而不是Live中的直接匹配。如果您认为Live中的行可能在Archive中没有相应的行,那么您的联合中需要另一个术语,例如:
TODAY
这将选择Live中那些在Archive中没有匹配行的行。如果您愿意,可以使用TODAY ± 1
或NULL::DATE
(或某些此类表达式)代替{{1}},具体取决于您的要求。
警告:未经测试的SQL - 可能存在错误!
答案 1 :(得分:0)
尝试:
i+1
查找不在存档中的实时行和
select name,id,TRN from live
minus
select name,id,TRN from archive
在档案中查找不在线的行。