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

Is there any better way to write this query

我为我的删除操作设计了以下查询。我是 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 子句。

数据库结构如下:

TableD数据有点类似下面

   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 检索与 Table A 的特定实体相关的 B_id

你的方法不一定有问题。然而,一个有用的替代技术是 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 以防止重复匹配。

从表 tD 中删除 WHERE EXISTS ( SELECT tB.B_id FROM Table B WHERE A_id = 123 AND tB.B_id = tD.B_id ) AND C_id IN (1, 2, 3 )

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

   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;