这是预期的并有文件记录。
WITH中的子语句彼此并与主查询并发执行。因此,在WITH中使用数据修改语句时,指定更新实际发生的顺序是不可预测的。所有语句都使用相同的快照执行(请参见第13章), 。这减轻了行更新实际顺序的不可预测性的影响,并且意味着RETURNING数据
(强调我的)
with deleted_emp as (
delete from employee
where id = 1
returning company_id, id as employee_id
)
delete from company
where id in (select company_id from deleted_emp)
and not exists (select *
from employee e
join deleted_emp af
on af.company_id = e.company_id
and e.id <> af.employee_id)
重要的是从not exists
子查询中排除刚删除的员工,因为这在第二个delete语句中始终可见,因此不存在永远不会为真。因此,子查询从本质上检查是否存在除分配给同一公司的已删除员工以外的其他员工。
在线示例:https://rextester.com/IVZ78695