使用通用表表达式运行多个查询

时间:2018-08-28 17:54:32

标签: sql postgresql common-table-expression

目前,我有一个使用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。

1 个答案:

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