Informix:两个相似表之间的差异?

时间:2018-01-05 11:24:12

标签: sql informix

当我遇到两个几乎相同的表中的数据差异时,我需要生成一个报告。 (我正在使用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 

2 个答案:

答案 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 ± 1NULL::DATE(或某些此类表达式)代替{{1}},具体取决于您的要求。

警告:未经测试的SQL - 可能存在错误!

答案 1 :(得分:0)

尝试:

i+1

查找不在存档中的实时行和

select name,id,TRN from live
minus
select name,id,TRN from archive

在档案中查找不在线的行。