【问题标题】:Fastest way to identify differences between two tables?识别两个表之间差异的最快方法?
【发布时间】:2011-01-18 13:59:37
【问题描述】:

我需要根据事务存档表检查实时表,但我不确定执行此操作的最快方法...

例如,假设我的实时表由以下列组成:

  • 期限
  • CRN
  • 费用
  • 等级代码

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

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

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

【问题讨论】:

  • 什么是主键?

标签: sql performance oracle plsql


【解决方案1】:
SELECT term, crn, fee, level_code
FROM live_data
MINUS
SELECT term, crn, fee, level_code
FROM historical_data

什么是实时的,但不是历史的。然后可以与此相反,以获取历史中的内容而不是生活中的内容。

【讨论】:

  • 我不确定是最快的,但它是唯一有效的答案。
【解决方案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;

【讨论】:

    【解决方案3】:

    你没有提到行是如何唯一标识的,所以我假设你也有一个“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 设置为某个“不可能”的值)。

    【讨论】:

    • 很遗憾,没有 ID。我只是比较列出的值。此外,此查询是否有助于识别存档中但不实时的记录?我需要这个双向工作......
    • 如果你没有唯一键,你怎么知道归档表中哪一组“历史记录”与活动表中的每一行相关?
    【解决方案4】:

    卸载到 table.unl 从表 1 中选择 * 按 1,2,3,4 排序

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

    diff table1.unl table2.unl > diff.unl

    【讨论】:

    • 感谢您的尝试,但我可以看出这是错误的。我的存档表将有多个日期的多个条目,这将返回所有条目,而不仅仅是最近的。附带说明一下,如果您可以帮助选择 * 并按数字而不是名称引用列,那么您会做得更好。
    • 对不起,桑尼。我不明白存档表中的 pk。我刚刚抓住了关于archive_date的文章。 :) 至于 * 和 1,2,3,4 ...它是为了给你这个想法,而无需我输入列。我的意思是卸载数据并进行比较,但请确保使用 order by 子句。懒惰是我的超能力。玩得开心!
    【解决方案5】:

    您可以使用以下形式的查询:

    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) 将它们全部放在同一个查询中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多