有没有更好的方法来编写此查询

时间:2015-10-08 05:24:33

标签: sql db2 sql-delete

我在下面设计了查询我的删除操作。我是SQL新手,只是想与经验丰富的人在这里查看是否正常或更好的方法。我正在使用DB2数据库

DELETE FROM TableD
    WHERE B_id IN 
     ( 
        SELECT B.B_id
          FROM TableB tB 
            INNER JOIN TableA tA
              ON tB.A_id = tA.A_id
          WHERE A_id = 123
      ) AND 
  C_id IN (1,2,3)

这有两个IN子句,我很担心,不确定我是否可以在任何地方使用EXISTS子句。

数据库结构如下:

  • 表A与表B有一对多的关系
  • 表B与表C有一对多的关系
  • 表B与表D有一对多的关系
  • 表D具有复合主键(B_id,C_id)

表D数据有​​点类似于下面

   B_id|C_id
  ----------
   1   |  1
   1   |  2
   1   |  3
   2   |  4
   2   |  5
   3   |  5

这里我必须删除在数组中包含C_id的行。但由于索引是B_id和D_id的组合,我通过等式运算符A_id = 123检索相关的B_id到表A的特定实体

3 个答案:

答案 0 :(得分:1)

您的方法没有任何问题。但是,一个有用的替代技术是merge

merge into TableD
using ( 
    select distinct 
        B.B_id
      from TableB tB 
        inner join TableA tA on
           tB.A_id = tA.A_id and
           A_id = 123
) AB
on 
    TableD.B_id = AB.B_id and
    C_id in (1,2,3)
when matched then delete;

请注意,我必须在内部查询中使用distinct来防止重复匹配。

答案 1 :(得分:1)

您也可以像这样使用合并:

   merge into TableD
   using TableB tB
   on B.B_id = TableD.B_id
   and tB.A_id in (select A_id from TableA tA where A_id = 123)
   and C_id in (1,2,3)
   when matched then delete;

答案 2 :(得分:0)

从TableD tD删除 哪里   存在(     选择       tB.B_id     从       表B tB     哪里       A_id = 123       AND tB.B_id = tD.B_id   )   AND C_id IN(1,2,3)