Выполнить несколько запросов с помощью общего табличного выражения - PullRequest
0 голосов
/ 28 августа 2018

В настоящее время у меня есть запрос с использованием предложения WITH, который я использую для получения списка идентификаторов из двух отдельных таблиц, которые я планирую DELETE ing.

WITH ids_to_delete AS (SELECT org.uuid, person.uuid FROM organizations org INNER JOIN people person ON org.uuid = person.org_uuid)

Проблема в том, что мне нужно использовать одно и то же утверждение в двух отдельных DELETE запросах. Один для таблицы organizations и один для таблицы people. Однако, если я разделяю эти операторы точкой с запятой, я теряю доступ к ids_to_delete, и если я просто повторю запрос, я не получу те же результаты.

Я бы хотел сделать что-то подобное, чтобы сохранить доступ к моим ids_to_delete результатам:

WITH ids_to_delete AS (SELECT org.uuid, person.uuid FROM organizations 
org INNER JOIN people person ON org.uuid = person.org_uuid),
DELETE FROM organizations WHERE uuid IN (SELECT org.uuid FROM ids_to_delete), 
DELETE FROM people WHERE uuid IN (SELECT person.uuid FROM ids_to_delete);

Дополнительно Организации-> Люди - это отношение «многие к одному», навязываемое FOREIGN KEY, поэтому мне нужно сначала удалить людей.

Использование PostgreSQL 9.6.

1 Ответ

0 голосов
/ 28 августа 2018

Postgres поддерживает delete в CTE. Таким образом, вы можете сформулировать это как один запрос:

WITH ids_to_delete AS (
      SELECT org.uuid, person.uuid
      FROM organizations org INNER JOIN
           people person
           ON org.uuid = person.org_uuid
     ),
     o as (
      DELETE FROM organizations
      WHERE uuid IN (SELECT org.uuid FROM ids_to_delete)
      RETURNING org.uuid
     ) 
DELETE FROM people
WHERE uuid IN (SELECT person.uuid FROM ids_to_delete);
...