mssql 父子查找 sql
mssql parent child lookup sql
所以我这里有一个 table 和这个相似 http://sqlfiddle.com/#!9/ea557/1
这是一个更大的综合体 sql 的一小部分。我想要的输出需要像
ParentId | TopChildId | AllChild | Priority
--------------------------------------------
10 | 541 | 345, 541 | 2
12 | 125 | 123, 124,125 | 3
13 | 103 | 103, 104 | 2
14 | 161 | 161 | 1
我希望这是有道理的。因此,在一行中,我想查看具有最大优先级编号的父 ID、子 ID,并在一列中列出所有子 ID 的串联。
感谢对此的任何帮助。
要获得顶部 priority
的 CID
,您可以使用 ROW_NUMBER
。要获得每个 PID
的串联 CID
,您可以使用 FOR XML PATH
:
WITH Cte AS(
SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY PID ORDER BY priority DESC)
FROM ParChi
)
SELECT
ParentID = c.PID,
TopChildId = c.CID,
x.AllChild,
c.priority
FROM Cte c
CROSS APPLY(
SELECT STUFF((
SELECT ', ' + CONVERT(VARCHAR(10), CID)
FROM ParChi
WHERE PID = c.PID
ORDER BY priority
FOR XML PATH('')
),1, 2, '') AS AllChild
) x
WHERE rn = 1
ORDER BY ParentID
SELECT p.PID AS ParentId , MAX(p.CID) AS TopChildId, temp.AllChild, MAX(p.priority)
FROM ParChi p
OUTER APPLY
(
SELECT
STUFF((SELECT ', ' + pc.CID
FROM ParChi pc
WHERE pc.PID = p.PID
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 0, '') AS AllChild
)AS temp
GROUP BY p.PID ORDER BY p.PID
所以我这里有一个 table 和这个相似 http://sqlfiddle.com/#!9/ea557/1 这是一个更大的综合体 sql 的一小部分。我想要的输出需要像
ParentId | TopChildId | AllChild | Priority
--------------------------------------------
10 | 541 | 345, 541 | 2
12 | 125 | 123, 124,125 | 3
13 | 103 | 103, 104 | 2
14 | 161 | 161 | 1
我希望这是有道理的。因此,在一行中,我想查看具有最大优先级编号的父 ID、子 ID,并在一列中列出所有子 ID 的串联。
感谢对此的任何帮助。
要获得顶部 priority
的 CID
,您可以使用 ROW_NUMBER
。要获得每个 PID
的串联 CID
,您可以使用 FOR XML PATH
:
WITH Cte AS(
SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY PID ORDER BY priority DESC)
FROM ParChi
)
SELECT
ParentID = c.PID,
TopChildId = c.CID,
x.AllChild,
c.priority
FROM Cte c
CROSS APPLY(
SELECT STUFF((
SELECT ', ' + CONVERT(VARCHAR(10), CID)
FROM ParChi
WHERE PID = c.PID
ORDER BY priority
FOR XML PATH('')
),1, 2, '') AS AllChild
) x
WHERE rn = 1
ORDER BY ParentID
SELECT p.PID AS ParentId , MAX(p.CID) AS TopChildId, temp.AllChild, MAX(p.priority)
FROM ParChi p
OUTER APPLY
(
SELECT
STUFF((SELECT ', ' + pc.CID
FROM ParChi pc
WHERE pc.PID = p.PID
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 0, '') AS AllChild
)AS temp
GROUP BY p.PID ORDER BY p.PID