如何在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
相关产品推荐
相关产品推荐

