【问题标题】:Oracle SQL find different values in two tables with same schemaOracle SQL 在具有相同架构的两个表中找到不同的值
【发布时间】:2010-12-05 15:37:17
【问题描述】:

虽然有一些类似的问题,但我找不到完全适合我的问题的解决方案。

我有两个表 'new'、'old' 并且都有相同的架构 col1、col2、col3。

两者不一定有相同的记录,尤其是新的可能比旧的记录更多。

现在我正在寻找的是一个查询,返回 new.col3 与 old.col3 不同的所有记录(并且 new.col1 等于 old.col1)。 col3 可以有不同的值或 null。 col1 不是 PK,因此可能有多个具有相同 col1 值的记录。

我在不同组合中使用减号的所有尝试要么没有导致所有更改,要么包括具有旧 col3 值和新 col3 值的行。如上所述,我只需要/希望结果包含所有更改的 col3 值的 new.col1、new.col3。

非常感谢任何帮助;)

【问题讨论】:

  • 如果col1有重复值,你怎么知道col3被改变了还是只是不同的记录?
  • 每个相同的 col1 和 col3 集应该只有一条记录,但如果有更多记录,则它们是否都在结果集中返回也没关系。
  • 进一步信息:所有相同的 col1 指的是同一个人并且具有不同的 col2 值(在旧表和新表中相同)。关于这个查询虽然我只对 col1 和 col3 感兴趣。
  • 结果和答案(以及我在此处提供有用答案之前的尝试)使我发现给我的表格对于我需要达到的结果不太适用,所以我会谈谈给 dbadmins 设置更适合的东西。

标签: sql oracle comparison


【解决方案1】:

以下将查找 new_table 中的所有行,这样在 old_table 中至少存在一个具有不同 col3 值的行。

select a.col1
      ,a.col3
  from new_table a
 where exists(select 'x' 
                from old_table b 
               where a.col1 = b.col1
                 and decode(a.col3, b.col3, 'same', 'diff') = 'diff'
              );

【讨论】:

    【解决方案2】:

    如果无论 col2 列中的内容是什么,并且您不希望删除的项目(旧项目但不是新项目)出现在结果中,那么这可能会有所帮助:

    select new.col1, new.col3 from new 
    where new.col3 not in (select old.col3 from old where old.col1 = new.col1)
    

    【讨论】:

    • 这不也返回新记录但旧记录不存在的记录(旧.col1中不存在new.col1)?
    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2022-11-17
    • 2017-01-17
    相关资源
    最近更新 更多