удаление postgres из косвенно связанных таблиц - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть TableA, которая может иметь много связанных с ним таблиц TableB, а TableB может иметь много связанных с ней строк TableC, у которых TableC есть много строк TableD. Итак, TableA -> TableB -> TableC -> TableD. То, что я хочу сделать, это дать идентификатор строки TableA, выбрать все строки 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 голосов
/ 11 сентября 2018

Используйте следующий подзапрос, чтобы получить все tableCId s, которые относятся к вашему данному tableAId:

SELECT DISTINCT TableC.tableCId
FROM TableC
LEFT JOIN TableB ON TableC.tableBId = TableB.tableBId
WHERE TableB.tableAId = 2

Теперь вы можете использовать этот подзапрос в вашей команде удаления, который должен работать примерно так:

DELETE FROM tableD
USING ( ... ) sub
WHERE tableD.tableCId IN (SELECT * FROM sub)
0 голосов
/ 11 сентября 2018

Как то так,

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
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...