代码之家  ›  专栏  ›  技术社区  ›  filippo

在Oracle中执行表同步报告的优雅方式?

  •  1
  • filippo  · 技术社区  · 15 年前

    所以我有两张桌子

    表A

    KEYA | VALUE
    1    |  1.2
    2    |  2.3
    3    |  8.3
    

    KEYB | VALUE
    1    |  1.2
    3    |  1.6
    4    |  5.5
    

    我想创建一个关于这两个表之间同步状态的报告。一、 e.生成 记录以下信息:

    1. 记录X在表B中,但不在表A中
    2. 两个表中都有记录X,但值不同

    我真的不需要这段文字(实际上,我不想要)。可能只是价值观本身:

    [Table_A.KEYA (if present)]|[Table_A.Value (if present)]|[Table_B.KEYB (if present)]|[Table_B.Value (if present)]
    

    给定的示例表应产生:

    |2|2.3| |   |
    |3|8.3|3|1.6|
    | |   |4|5.5|
    

    我目前正在使用长系列的连接和减法来实现这一点,但我认为这对于DBs和Oracle来说应该是很常见的,因为它们可能有一种更优雅(而且可能更高效)的方式来实现这一点。谁能给我点小费吗?

    f。

    2 回复  |  直到 12 年前
        1
  •  1
  •   aw crud    15 年前
    select a.keya, a.value a_value, b.keyb, b.value b_value
    from table_a a
    full outer join table_b b
    on a.keya = b.keyb
    where a.keya IS NULL
    or b.keya IS NULL
    or (a.value is null and b.value is not null)
    or (a.value is not null and b.value is null)
    or a.value <> b.value
    
        2
  •  1
  •   Martin Schapendonk    15 年前

    我认为连接和减法都很好:-)

    select *, null, null
    from a
    where not exists (select keyb
      from b 
      where keyb = a.keya)
    union all
    select a.*, b.*
    from a, b
    where a.keya = b.keya
    and a.value <> b.value -- please extend if null values are allowed
    union all
    select null, null, *
    from b
    where not exists (select keya
      from a
      where keya = b.keyb)
    

    很快就会被很多列弄得一团糟。

    推荐文章