Select 来自删除子查询的返回值
Select from a delete subquery returning values
我正在尝试将两个步骤组合成一个查询。我正在尝试从一个 table 中删除具有特定商店 ID 的行,然后停用另一个 table 中的员工(如果他们在第一个 table 中不再有任何匹配的行)。这是我得到的:
UPDATE business.employee
SET active = FALSE
WHERE employee_id IN
(SELECT employee_id FROM (DELETE FROM business.employeeStore
WHERE store_id = 1000
RETURNING employee_id) Deleted
LEFT JOIN business.employeeStore EmployeeStore
ON Deleted.employee_id = EmployeeStore.employee_id
WHERE EmployeeStore.store_id IS NULL)
逻辑上,我认为我写的是正确的,但在句法上,它不完全是。看起来这应该是可能的,因为 DELETE FROM
子查询是 returning 单列 table 结果,并且该子查询本身工作正常。但它告诉我 FROM
处或附近存在语法错误。即使我不包括查询的 UPDATE
部分,只执行内部 SELECT
部分,它也会给我同样的错误。
更新:我尝试使用 WITH
命令来解决语法问题,如下所示:
WITH Deleted AS (DELETE FROM business.employeeStore
WHERE store_id = 1000
RETURNING employee_id)
UPDATE business.employee
SET active = FALSE
WHERE employee_id IN
(SELECT employee_id FROM Deleted
LEFT JOIN business.employeeStore EmployeeStore
ON Deleted.employee_id = EmployeeStore.employee_id
WHERE EmployeeStore.store_id IS NULL)
这不会产生任何错误,但在研究代码一段时间后,我确定虽然它确实从 WITH
部分获得了结果,但实际上并没有DELETE
直到 UPDATE
完成。所以 SELECT
子查询没有 return 任何结果。
我终于能够弄清楚如何使用 WITH
来做到这一点。主要问题是需要处理处于 DELETE
之前状态的 table。我已将所有内容保存在一个查询中,如下所示:
WITH Deleted AS
(DELETE FROM business.employeeStore
WHERE store_id = 1000
RETURNING employee_id)
UPDATE business.employee
SET active = FALSE
WHERE employee_id IN
(SELECT employee_id FROM Deleted)
AND employee_id NOT IN
(SELECT employee_id FROM Deleted
JOIN business.employeeStore EmployeeStore
ON Deleted.employee_id = EmployeeStore.employee_id
WHERE EmployeeStore.store_id != 1000)
我正在尝试将两个步骤组合成一个查询。我正在尝试从一个 table 中删除具有特定商店 ID 的行,然后停用另一个 table 中的员工(如果他们在第一个 table 中不再有任何匹配的行)。这是我得到的:
UPDATE business.employee
SET active = FALSE
WHERE employee_id IN
(SELECT employee_id FROM (DELETE FROM business.employeeStore
WHERE store_id = 1000
RETURNING employee_id) Deleted
LEFT JOIN business.employeeStore EmployeeStore
ON Deleted.employee_id = EmployeeStore.employee_id
WHERE EmployeeStore.store_id IS NULL)
逻辑上,我认为我写的是正确的,但在句法上,它不完全是。看起来这应该是可能的,因为 DELETE FROM
子查询是 returning 单列 table 结果,并且该子查询本身工作正常。但它告诉我 FROM
处或附近存在语法错误。即使我不包括查询的 UPDATE
部分,只执行内部 SELECT
部分,它也会给我同样的错误。
更新:我尝试使用 WITH
命令来解决语法问题,如下所示:
WITH Deleted AS (DELETE FROM business.employeeStore
WHERE store_id = 1000
RETURNING employee_id)
UPDATE business.employee
SET active = FALSE
WHERE employee_id IN
(SELECT employee_id FROM Deleted
LEFT JOIN business.employeeStore EmployeeStore
ON Deleted.employee_id = EmployeeStore.employee_id
WHERE EmployeeStore.store_id IS NULL)
这不会产生任何错误,但在研究代码一段时间后,我确定虽然它确实从 WITH
部分获得了结果,但实际上并没有DELETE
直到 UPDATE
完成。所以 SELECT
子查询没有 return 任何结果。
我终于能够弄清楚如何使用 WITH
来做到这一点。主要问题是需要处理处于 DELETE
之前状态的 table。我已将所有内容保存在一个查询中,如下所示:
WITH Deleted AS
(DELETE FROM business.employeeStore
WHERE store_id = 1000
RETURNING employee_id)
UPDATE business.employee
SET active = FALSE
WHERE employee_id IN
(SELECT employee_id FROM Deleted)
AND employee_id NOT IN
(SELECT employee_id FROM Deleted
JOIN business.employeeStore EmployeeStore
ON Deleted.employee_id = EmployeeStore.employee_id
WHERE EmployeeStore.store_id != 1000)