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

时间:2010-02-18 23:45:45

标签: sql performance oracle plsql

我需要针对事务存档表检查实时表,我不确定这样做的最快方法...

例如,假设我的直播表由以下列组成:

  • 期限
  • CRN
  • 级别代码

我的存档表将具有相同的列,但也有一个存档日期,因此我可以看到实时表在给定日期的值。

现在......我如何编写查询以确保实时表的值与存档表中的最新条目相同?

PS我更喜欢在SQL中处理这个问题,但如果速度更快,PL / SQL也是一个选择。

5 个答案:

答案 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)