Informix:两个相似表之间的区别?

Posted

技术标签:

【中文标题】Informix:两个相似表之间的区别?【英文标题】:Informix: differences between two similar tables? 【发布时间】:2018-01-05 11:24:12 【问题描述】:

当我在两个几乎相同的表中发现任何数据差异时,我需要生成一份报告。 (我使用的是 Informix 数据库版本 11.70。)

例如:我的活动表有列:

直播

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  

存档表具有相同的列集,只是它还有一个日期列,因此我可以查看实时表在给定日期的值。

与存档数据相比,我将如何编写查询以查找实时数据中的值是否发生变化。

我试过这个查询:

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 

【问题讨论】:

您的示例查询不包括日期字段;您的预期输出确实如此。这是概念上的脱节。 【参考方案1】:

你可以考虑:

SELECT "Live" AS source, a.date, a.name, a.id, a.trn
  FROM archive AS a JOIN live AS l
    ON a.name = l.name AND a.id = l.id AND a.trn = l.trn
UNION  ALL
SELECT "Archive" AS source, a.date, a.name, a.id, a.trn
  FROM archive AS a
 WHERE NOT EXISTS(
       SELECT * FROM live AS l
        WHERE a.name = l.name AND a.id = l.id AND a.trn = l.trn
       )

这会显示存档中与 Live 中的每一行相匹配的行,以及 显示存档中的每一行,而在 Live 中没有直接匹配。如果您认为 Live 中的行可能在 Archive 中没有对应的行,则您需要在 union 中添加另一个术语,例如:

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
       )

这会选择 Live 中那些在 Archive 中没有匹配行的行。如果您愿意,可以根据您的要求使用TODAYTODAY ± 1(或某些此类表达式)代替NULL::DATE

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

【讨论】:

【参考方案2】:

试试:

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

在实时中查找不在存档中的行,并且

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

在存档中查找非实时行。

【讨论】:

对不起,我在第 12 版中检查过。 抱歉简短的回复;今天下午我还有一些其他的任务要处理。没有“减号”,我们的选项是“不在”或外连接。 “减号”比较空值和数据,其他两个不比较。有一些方法可以解决这个问题,但不是那么干净。这些列中的任何一个是否被限制为“非空”,因为这会有所帮助。你要处理多少行?

以上是关于Informix:两个相似表之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

informix数据库锁表处理方法

informix SQL查询咨询

如何获得两个日期之间的差异(informix)?

Informix - 两个日期之间

两个日期时间之间的差异(以毫秒为单位)(Informix)

在不同 DBMS 之间传输数据