【问题标题】:Locally symmetric difference in sqlsql中的局部对称差异
【发布时间】:2010-08-25 00:32:29
【问题描述】:

我有一个类似于this StackOverflow question 的问题,除了我需要从比较中排除某些字段但仍将其包含在结果集中。
我将问题描述为局部对称差异。

例如,表 A 和 B 有 X、Y、Z 列,我只想比较 Y、Z 的差异,但我仍然希望结果集包含 X。

【问题讨论】:

  • 请提供示例数据和预期输出

标签: sql oracle symmetric-difference


【解决方案1】:

听起来这基本上就是你想要的。匹配两个表在 Y 和 Z 列上的行,找到不匹配的行,并输出 X、Y 和 Z 列的值。

SELECT a.x, a.y, a.z, b.x, b.y, b.z
  FROM a FULL OUTER JOIN b ON a.y = b.y AND a.z = b.z
  WHERE a.y IS NULL OR b.y IS NULL

【讨论】:

    【解决方案2】:

    用于完全连接的旧式 SQL - A 与 B 连接,不包括 B 中的行以及 A 中的行(中间):

    -- all rows in A with or without matching B
    select a.x, a.y, a.z 
      from a
           left join b
             on a.x = b.x
            and a.y = b.y
    union all
    -- all rows in B with no match in A to "exclude the middle"
    select b.x, b.y, null as z
      from b
     where not exists (select null
                         from a
                        where b.x = a.x
                          and b.y = a.y)
    

    ANSI 风格:

    select coalesce(a.x, b.x) as x,
           coalesce(a.y, b.y) as y,
           a.z
      from a 
           full outer join b
             on a.x = b.x
            and a.y = b.y
    

    聚结的存在是为了安全;我实际上从来没有理由在现实世界中编写完整的外部连接。

    如果你真的想知道两个表是否相同,方法如下:

    SELECT COUNT(*) 
      FROM (SELECT list_of_columns
              FROM one_of_the_tables
             MINUS
            SELECT list_of_columns
              FROM the_other_table
            UNION ALL
            SELECT list_of_columns
              FROM the_other_table
             MINUS
            SELECT list_of_columns
              FROM one_of_the_tables)
    

    如果返回非零结果,则存在差异。它不会告诉你它在哪个表中,但它是一个开始。

    【讨论】:

    • 如果one_of_the_tables 包含the_other_table 中的数据子集,则最后一个查询也将返回0。您需要在两个方向上做 MINUS 来测试数据集是否完全相同。
    猜你喜欢
    • 2010-09-09
    • 2023-03-27
    • 1970-01-01
    • 2021-09-04
    • 2014-10-05
    • 2016-03-27
    • 2020-05-17
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多