我有一个TableA可以有很多与之相关的TableB,而TableB可以有很多与其相关的TableC行,其中TableC有许多TableD行。因此,TableA-> TableB-> TableC-> TableD。我要给的是TableA行ID,选择与其他表相关的所有TableD行,并删除所有这些行。
TableA | TableB | TableC | TableD
--------------------------------------
tableAId | tableAId | tableBId | tableCId
| tableBId | tableCId | tableDId
和我尝试过的查询:
DELETE FROM TableD
WHERE TableA.tableAId = 2
AND TableA.tableAId= TableB.tableAId
AND TableB.tableBId= TableC.tableBId
AND TableC.tableCId = TableD.tableCId
样本表
TableA TableB TableC TableD
tableAID | tableAID tableBId | tableBId tableCId | tableCId tableDId
---------|--------------------|---------------------|---------------------
1 | 1 15 | 15 5 | 6 4
2 | 2 16 | 16 6 | 5 3
5 14
5 11
给定tableAId = 1所需的结果
TableA TableB TableC TableD
tableAID | tableAID tableBId | tableBId tableCId | tableCId tableDId
---------|--------------------|---------------------|---------------------
1 | 1 15 | 15 5 | 6 4
2 | 2 16 | 16 6 |
答案 0 :(得分:1)
使用以下子查询获取与给定tableCId
相关的所有tableAId
:
SELECT DISTINCT TableC.tableCId
FROM TableC
LEFT JOIN TableB ON TableC.tableBId = TableB.tableBId
WHERE TableB.tableAId = 2
您现在可以在delete命令中使用此子查询,该子查询的工作方式如下:
DELETE FROM tableD
USING ( ... ) sub
WHERE tableD.tableCId IN (SELECT * FROM sub)
答案 1 :(得分:0)
这样的事情,
DELETE
FROM TableD AS inner
WHERE EXISTS (
SELECT
FROM tableD AS outer
JOIN tableC
USING (tableDid)
JOIN tableB
USING (tableBid)
JOIN tableA
USING (tableAid)
WHERE tableAId = 2
AND outer.tableDid = inner.tableDid
);