两个表之间识别差异的最快方法是什么?

7
我需要检查一个实时表和一个事务性存档表之间的差异,但我不确定最快的方法是什么...
例如,假设我的实时表由以下列组成:
术语 CRN 费用 级别代码
我的存档表将具有相同的列,但还将具有存档日期,以便我可以查看给定日期实时表的值。
现在...我该如何编写查询以确保实时表的值与存档表中最新条目的值相同?
PS:我希望在SQL中处理此操作,但如果使用PL / SQL更快,则也是一种选择。

主键是什么? - WW.
5个回答

11
SELECT term, crn, fee, level_code
FROM live_data
MINUS
SELECT term, crn, fee, level_code
FROM historical_data

仅存在于现有数据而不在历史数据中的内容。可以对其进行反向联合操作,以获取存在于历史数据中但不在现有数据中的内容。


我不确定这是否是最快的,但它是唯一实际起作用的答案。 - Sonny Boy

3

简单来说:

SELECT collist
  FROM TABLE A
minus 
SELECT collist
  FROM TABLE B
UNION ALL
SELECT collist
  FROM TABLE B
minus 
SELECT collist
  FROM TABLE A;

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
);

注意:此查询不考虑NULL值 - 如果任何列可为空,则可以添加适当的逻辑(例如,将每个列NVL为某个“不可能”的值)。

很遗憾,没有ID。我只是在比较所列出的值。此外,这个查询是否有助于识别存档但不是实时的记录?我需要它能够双向工作... - Sonny Boy
如果您没有唯一的键,您如何知道归档表中的哪个“历史记录”集与实时表中的每一行相关联? - Jeffrey Kemp

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) 在同一查询中获取它们所有。


0

卸载到 table.unl 从 table1 选择 * 按 1、2、3、4 排序

卸载到 table2.unl 从 table2 选择 * 按 1、2、3、4 排序

diff table1.unl table2.unl > diff.unl


谢谢你的尝试,但我已经看出这是错误的了。我的存档表将有多个日期的多个条目,这将返回所有条目,而不仅仅是最近的。顺便说一句,如果您可以帮助选择*并按编号引用列而不是名称,那么您会更好。 - Sonny Boy
抱歉,Sonny。我不理解归档表中的pk。我只注意到了关于archive_date的部分。 :) 至于*和1,2,3,4 ...,它是为了让你有个想法,而不必让我打出所有列名。我的意思是卸载数据并进行差异比较,但一定要使用order by子句。懒惰是我的超能力。玩得开心! - sparkkkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接