有没有更好的方法来编写这个查询
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 子句。
数据库结构如下:
- Table A 与 Table B
具有一对多关系
- Table B 与 Table C
具有一对多关系
- Table B 与 Table D
有一对多关系
- Table D 有复合主键 ( B_id, C_id )
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;
我为我的删除操作设计了以下查询。我是 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 子句。
数据库结构如下:
- Table A 与 Table B 具有一对多关系
- Table B 与 Table C 具有一对多关系
- Table B 与 Table D 有一对多关系
- Table D 有复合主键 ( B_id, C_id )
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;