sql - 如何找到同一张表的父行
问题描述
我有这样的表:
childId | parentId
1 | null
2 | 1
3 | null
4 | 2
列 childId 是该表的主键,parentId 是同一个表的外键,并引用列 (childId)。
我需要调用一个函数并发送参数(childId),函数会找到这个孩子的最父行。
示例:如果我通过 childId = 4,则输出结果需要为 1。
这个问题有什么解决办法吗?
编辑:
我需要像层次结构顶级行之类的东西。我曾尝试使用递归 CTE,但无法完成。
解决方案
看起来递归 CTE(公用表表达式)非常适合这种类型的查询。
样本数据
DECLARE @T TABLE (childId int, parentId int);
INSERT INTO @T VALUES
( 1 , null),
( 2 , 1 ),
( 3 , null),
( 4 , 2 );
询问
用参数替换常量4
。我包括在内AnchorChildID
,AnchorParentID
以便更容易理解结果和正在发生的事情。在没有最终过滤器的情况下运行此查询WHERE ParentID IS NULL
以查看它是如何工作的。
WITH
CTE
AS
(
SELECT
childId AS AnchorChildID
,parentId AS AnchorParentID
,childId AS ChildID
,parentId AS ParentID
FROM @T AS T
WHERE childId = 4
UNION ALL
SELECT
CTE.AnchorChildID
,CTE.AnchorParentID
,T.ChildID
,T.ParentID
FROM
CTE
INNER JOIN @T AS T ON T.ChildID = CTE.ParentID
)
SELECT ChildID
FROM CTE
WHERE ParentID IS NULL
OPTION(MAXRECURSION 0)
;
结果
ChildID
1
推荐阅读
- list - 我有以下字符串列表,但我想应用过滤器,以便我可以从列表中获取某些项目。如何做到这一点?
- php - 从连接表中获取数据的问题
- haskell - 实例声明并将字符串转换为 Maybe 类型
- azure - 为什么服务结构服务的分区策略绑定到分区而不是服务?
- c - 有没有办法检查 Web 服务器远程支持的最大并发 tcp 连接数?
- java - 如何使“通用方法声明”接受子类
- php - 带有 200 个 HTTP 代码的 IPN 响应,但我的数据库中没有任何内容
- excel - vba中的Vlookup循环,如何调试这个?
- python - Django 投票导致重复计算
- nativescript - 如何更改css中图标的大小?