目前,我有一个使用WITH
子句的查询,我正在使用该子句从计划进行DELETE
的两个单独表中获取ID列表。
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。
答案 0 :(得分:2)
Postgres在CTE中支持delete
。因此,您可以将此短语表达为一个查询:
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);