【问题标题】:Query to check the consistency of records查询以检查记录的一致性
【发布时间】:2010-06-17 23:32:30
【问题描述】:

我有四张桌子

表A:

  • id1
  • id2
  • id3
  • 价值

表B:

  • id1
  • 描述

表C:

  • id2
  • 描述

表D:

  • id3
  • 描述

我需要做的是检查表 B C 和 D 中 id1 id2 id3 的所有组合是否存在于表 A 中。换句话说,表 A 应该包含存储在其他三个表中的 id1 id2 和 id3 的所有可能组合。

【问题讨论】:

    标签: sql plsql


    【解决方案1】:

    此查询评估 id1、id2 和 id3 的所有组合(交叉连接)并找出表 a 中不存在的组合。

    select b.id1, c.id2, d.id3 from
     TableB b cross join TableC c cross join TableD d WHERE NOT EXIST
     (select 1 FROM TableA a WHERE a.id1=b.id1 AND a.id2=c.id2 AND a.id3=d.id3)
    

    编辑:使用正确的连接

    SELECT allPerms.id1, allPerms.id2, allPerms.id3 FROM a RIGHT JOIN (select b.id1, c.id2, d.id3 from
     TableB b cross join TableC c cross join TableD) allPerms
     ON a.id1=allPerms.id1 AND a.id2=allPerms.id2 AND a.id3=allPerms.id3
     WHERE a.id1 IS NULL
    

    两者几乎相同。由于我们实际上并没有从连接表中获取值,因此有些人更喜欢第一种方法,因为它捕捉了查询的意图和精神。第二个版本更“面向实现”。一个好的优化器会为两者生成一个有效的计划,但在一些较小的 RDBMS 上,第二个版本会运行得更快。

    使用表 D 的预定义集 - id3 具有值 (2,5,6)

    select b.id1, c.id2 from
     TableB b cross join TableC c WHERE NOT EXIST
     (select 1 FROM TableA a WHERE a.id1=b.id1 AND a.id2=c.id2 AND a.id3 IN (2,5,6))
    

    但是,这不会为您提供表 A 行中缺少的 id3。为此,我认为最简单的方法是通过联合来模拟表格,例如

    select b.id1, c.id2, d.id3 from
     TableB b, TableC c, (select 2 id3 union select 5 union select 6) d 
    WHERE NOT EXIST
     (select 1 FROM TableA a WHERE a.id1=b.id1 AND a.id2=c.id2 AND a.id3=d.id3)
    

    (这仍然使用交叉连接 - 如果表用逗号分隔,则暗示它。)

    【讨论】:

    • 我试图用内部连接来写这个,那会奏效吗?如果不是,请简要说明这两者有什么区别? (不好意思问了这么一个菜鸟问题)
    • 内连接将在两个表之间找到相同的值。你知道你有哪些值(它们已经在 A 中)——你想找到你没有的值。这意味着外连接(其中缺失值连接为 NULL)或 EXISTS 子查询,就像我的第一个示例一样。我添加了一个外部连接示例。
    • 首先谢谢大家。我仍在用我的真实场景进行测试(这仍然比上面的例子更复杂)。我仍在努力。还有一个问题:如果 TableD 不存在,我该怎么办,但我需要使用一组预定义的 id3,例如(2,5,6)。
    • (union select 2 union select 5 union select 6) 似乎不起作用。
    • 抱歉,我有点太仓促了...您需要添加一个列名。我已经更新了示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2017-08-11
    • 1970-01-01
    • 2011-02-19
    • 2019-12-31
    相关资源
    最近更新 更多