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

如何在SQL中获取Product表指定列值的所有前置列值?

解决链式节点的前置遍历问题

嘿,你的Product表其实是个单向链式结构(A → M → T → F),要拿到某个节点的所有前置节点,单次自连接只能搞定直接上一级,没法处理多层嵌套的情况,这里用递归CTE(公共表表达式)是最靠谱的方案。

核心思路:递归遍历链条

递归CTE会分成两部分工作:

  • 先找到输入节点的直接前置节点(锚点部分)
  • 再不断向上递归,把每一层的前置节点都捞出来,直到找不到更上层的节点为止

具体SQL代码

假设你要查输入'T'的所有前置节点,SQL可以这么写:

WITH RECURSIVE PreNodes AS (
    -- 第一步:先抓输入节点的直接前置
    SELECT Start
    FROM Product
    WHERE End = 'T'
    UNION ALL
    -- 第二步:递归往上找,直到没有更上层的节点
    SELECT p.Start
    FROM Product p
    JOIN PreNodes pn ON p.End = pn.Start
)
SELECT Start AS 前置节点 FROM PreNodes;

如果要动态切换输入的节点,把'T'换成对应的参数就行(比如MySQL用?,SQL Server用@input)。

测试不同输入的结果

  • 输入'M'时,返回结果:
    前置节点
    A
    
  • 输入'F'时,返回结果:
    前置节点
    T
    M
    A
    

要是你想按从最早到最晚的顺序输出,最后加个ORDER BY Start就行。

为啥之前的自连接不行?

普通自连接只能关联一层,比如你写:

SELECT p1.Start
FROM Product p1
JOIN Product p2 ON p1.End = p2.Start
WHERE p2.End = 'T';

这只能拿到M,拿不到更上层的A。而递归CTE会不断迭代,把整个前置链条都遍历一遍,自然就能拿到所有前置节点啦。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:15