postgres从间接相关表中删除

时间:2018-09-11 18:24:39

标签: sql postgresql

我有一个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       |

2 个答案:

答案 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
);