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 中没有匹配行的行。如果您愿意,可以根据您的要求使用TODAY
或TODAY ± 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:两个相似表之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章