gpt4 book ai didi

sql - 如何在sql中的单个查询中查找子节点列表

转载 作者:行者123 更新时间:2023-12-03 02:29:56 25 4
gpt4 key购买 nike

您好,我有下表。

Create table ParentChildhierarchy (Parent varchar(50),Child varchar(50))

在此表中,我使用下面的 SQL 脚本插入了几行。

insert into ParentChildhierarchy values('A','B')

insert into ParentChildhierarchy values('B','C')

insert into ParentChildhierarchy values('C','D')

insert into ParentChildhierarchy values('E','A')

insert into ParentChildhierarchy values('F','K')

现在我需要一个单行查询,它可以为我提供所有子节点的列表。例如,对于父级“A”,它应该列出“B,C,D”。对于父级“B”,它应该列出“C,D”,对于父级“C”,它应该列出“D”,对于父级“D”,它应该列出“Null”,对于父级“E”,它应该列出向下“A”查找父“F”,它应该向下列出“K”

最佳答案

使用递归查询:

DECLARE @Parent VARCHAR(50) = 'A'
;WITH cte
AS (SELECT *
FROM ParentChildhierarchy
WHERE parent = @Parent
UNION ALL
SELECT a.*
FROM ParentChildhierarchy a
JOIN cte b
ON a.parent = b.child)
SELECT *
FROM cte

更新:下面的查询将连接结果:

DECLARE @Parent VARCHAR(50) = 'A'
;WITH cte
AS (SELECT *
FROM ParentChildhierarchy
WHERE parent = @Parent
UNION ALL
SELECT a.*
FROM ParentChildhierarchy a
JOIN cte b
ON a.parent = b.child)
SELECT STUFF((SELECT ',' + Child
FROM cte
FOR XML PATH('')), 1, 1, '')

SQLFiddle

更新2:

对于所有行:

;WITH cte
AS (SELECT *,
Parent [TopParent]
FROM ParentChildhierarchy
--WHERE Parent = 'A'
UNION ALL
SELECT a.*,
[TopParent]
FROM ParentChildhierarchy a
JOIN cte b
ON a.parent = b.child)
SELECT [TopParent],
STUFF((SELECT ',' + Child
FROM cte b
WHERE a.[TopParent] = b.[TopParent]
FOR XML PATH('')), 1, 1, '')
FROM cte a
GROUP BY [TopParent]

SQLFiddle

所有没有子项的行:

;WITH cte
AS (SELECT *,
Parent [TopParent]
FROM ParentChildhierarchy
--WHERE Parent = 'A'
UNION ALL
SELECT a.*,
[TopParent]
FROM ParentChildhierarchy a
JOIN cte b
ON a.parent = b.child) SELECT [TopParent],
STUFF((SELECT ',' + Child
FROM cte b
WHERE a.[TopParent] = b.[TopParent]
FOR XML PATH('')), 1, 1, '')
FROM cte a
GROUP BY [TopParent]
UNION
SELECT Child,
NULL
FROM ParentChildhierarchy p
WHERE NOT EXISTS (SELECT 1
FROM ParentChildhierarchy c
WHERE p.Child = c.Parent)

SQLFiddle

查看有关递归查询的 Microsoft 文档:https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

关于sql - 如何在sql中的单个查询中查找子节点列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29839037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com