代码之家  ›  专栏  ›  技术社区  ›  Sonny Boy

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

  •  6
  • Sonny Boy  · 技术社区  · 14 年前

    我需要对照事务性归档表检查一个活动表,我不确定最快的方法…

    例如,假设我的活动表由以下列组成:

    • 术语
    • 氮化铬
    • 费用
    • 级码

    我的存档表将有相同的列,但也有一个存档日期,这样我就可以看到活动表在给定日期的值。

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

    ps我希望在SQL中处理这个问题,但是如果pl/sql更快,它也是一个选项。

    5 回复  |  直到 11 年前
        1
  •  10
  •   pierre    14 年前
    SELECT term, crn, fee, level_code
    FROM live_data
    MINUS
    SELECT term, crn, fee, level_code
    FROM historical_data
    

    什么是活的,但不是历史的。然后可以结合到相反的这一点,以得到什么在历史上,但不是生活。

        2
  •  2
  •   pj.    14 年前

    简单地说:

    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
  •  1
  •   Jeffrey Kemp    14 年前

    您没有提到行是如何唯一标识的,所以我假设您也有一个“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
    );
    

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

        4
  •  0
  •   sparkkkey    14 年前

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

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

    diff表1.unl表2.unl>diff.unl

        5
  •  0
  •   Stephen Denne    14 年前

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

    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)