You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

闭包表存在多条相同路径时删除指定关联的SQL实现问题

问题分析

你要删除的是所有经过B->D这条父子边的闭包关联记录,原SQL的问题是没有对路径深度做匹配,导致只要祖先包含B、后代包含D的关联都会被命中,不管是不是走的B->D这条路径,所以才会误筛选出A到D深度为3的记录。

修改方案

只需在原WHERE条件中新增深度匹配规则即可,修改后的查询SQL如下:

SELECT link.ancestor, link.descendant, link.depth
FROM closure_table p,
     closure_table link,
     closure_table c
WHERE p.ancestor = link.ancestor
  AND c.descendant = link.descendant
  AND p.descendant = 'B'
  AND c.ancestor = 'D'
  -- 新增深度匹配:祖先到B的深度 + B到D的1层 + D到后代的深度 = 关联记录的总深度
  AND link.depth = p.depth + 1 + c.depth;
匹配逻辑说明
  • 对于B->D的直接关联:p是B->B(深度0),c是D->D(深度0),总深度0+1+0=1,刚好匹配B->D深度为1的待删除记录
  • 对于A->D深度为2的关联:p是A->B(深度1),c是D->D(深度0),总深度1+1+0=2,刚好匹配这条待删除记录
  • 对于A->D深度为3的关联:走的是A->E->C->D的路径,没有经过B->D边,不满足深度匹配规则,不会被查询命中

执行修改后的SQL返回的结果就是仅需要删除的两条记录:

AncestorDescendantDepth
AD2
BD1

内容的提问来源于stack exchange,提问作者Zenor27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:54:03