我需要针对事务存档表检查实时表,我不确定这样做的最快方法...
例如,假设我的直播表由以下列组成:
我的存档表将具有相同的列,但也有一个存档日期,因此我可以看到实时表在给定日期的值。
现在......我如何编写查询以确保实时表的值与存档表中的最新条目相同?
PS我更喜欢在SQL中处理这个问题,但如果速度更快,PL / SQL也是一个选择。
答案 0 :(得分:11)
SELECT term, crn, fee, level_code
FROM live_data
MINUS
SELECT term, crn, fee, level_code
FROM historical_data
什么是现场但不是历史性的。然后可以与此相反,以便在历史中获得什么,但不能生活。
答案 1 :(得分:2)
简单地:
SELECT collist
FROM TABLE A
minus
SELECT collist
FROM TABLE B
UNION ALL
SELECT collist
FROM TABLE B
minus
SELECT collist
FROM TABLE A;
答案 2 :(得分:1)
您没有提及如何唯一标识行,因此我假设您还有一个“id”列:
SELECT *
FROM livetable
WHERE (term, crn, fee, levelcode) NOT IN (
SELECT FIRST_VALUE(term) OVER (ORDER BY archivedate DESC)
,FIRST_VALUE(crn) OVER (ORDER BY archivedate DESC)
,FIRST_VALUE(fee) OVER (ORDER BY archivedate DESC)
,FIRST_VALUE(levelcode) OVER (ORDER BY archivedate DESC)
FROM archivetable
WHERE livetable.id = archivetable.id
);
注意:此查询不考虑NULLS - 如果任何列可以为空,则可以添加合适的逻辑(例如NVL每列到某个“不可能”的值)。
答案 3 :(得分:0)
卸载到table.unl 从table1中选择* 按1,2,3,4排序
卸载到table2.unl 从table2中选择* 按1,2,3,4排序
diff table1.unl table2.unl> diff.unl
答案 4 :(得分:0)
您可以使用表单查询:
SELECT your columns FROM your live table
EXCEPT
SELECT your columns FROM your archive table WHERE archive date is most recent;
任何结果都会是您的实时表格中不在最新档案中的行。
如果您还需要最近存档中不在实时表格中的行,只需反转选择的顺序,然后重复,或通过执行(live UNION archive) EXCEPT (live INTERSECTION archive)