在以下语句完成之前,不提交CTE删除

在以下语句完成之前,不提交CTE删除,第1张

在以下语句完成之前,不提交CTE删除

这是预期的并有文件记录。

引用手册

WITH中的子语句彼此并与主查询并发执行。因此,在WITH中使用数据修改语句时,指定更新实际发生的顺序是不可预测的。所有语句都使用相同的快照执行(请参见第13章),
因此它们不能“彼此”影响目标表 。这减轻了行更新实际顺序的不可预测性的影响,并且意味着RETURNING数据
是在不同的WITH子语句与主查询之间传递更改的唯一途径

(强调我的)


可以 使用链接的CTE删除公司:

with deleted_emp as (  delete from employee   where id = 1   returning company_id, id as employee_id)delete from companywhere 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)

重要的是从

notexists
子查询中排除刚删除的员工,因为这在第二个delete语句中始终可见,因此不存在永远不会为真。因此,子查询从本质上检查是否存在除分配给同一公司的已删除员工以外的其他员工。

在线示例:https://rextester.com/IVZ78695



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5675359.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存