Sql 获取子行及其上根行,并以特殊方式组合ID和名称
当我发送CatelogID时,需要获取带有rootcatelogName和RootCatelogID的CatelogIDSql 获取子行及其上根行,并以特殊方式组合ID和名称,sql,sql-server,Sql,Sql Server,当我发送CatelogID时,需要获取带有rootcatelogName和RootCatelogID的CatelogID CREATE TABLE catelog ( CatelogID BIGINT IDENTITY(1,1), CatelogName NVARCHAR(50) NOT NULL, ParentID BIGINT NULL ) SELECT * from catelog INSERT INTO catelog(catelogName,ParentID) VALU
CREATE TABLE catelog
(
CatelogID BIGINT IDENTITY(1,1),
CatelogName NVARCHAR(50) NOT NULL,
ParentID BIGINT NULL
)
SELECT * from catelog
INSERT INTO catelog(catelogName,ParentID)
VALUES('Embedded Sytem',NULL),
('Library',NULL),
('Books',2),
('Pages',3),
('Chapters',4),
('Paragraph',5),
('New Sytem',1),
('College',NULL)
当我把CatelogID设为6时,输出应该是这样的
O/p:
如果我没有通过任何值,我可以得到这样的结果吗
CatelogID RootCatelogName RootParentID
1 Embedded Sytem NULL
2 Library NULL
3 Library 2
4 Library 2
5 Library 2
6 Library 2
7 Embedded 1
8 College NULL
尝试层次结构CTE
DECLARE @id INT = 6;
WITH h AS (
SELECT CatelogID,catelogName,ParentID
FROM catelog
WHERE CatelogID = @id
UNION ALL
SELECT p.CatelogID,p.catelogName,p.ParentID
FROM h
JOIN catelog p ON p.CatelogID = h.ParentID
)
SELECT t.*
FROM h
CROSS APPLY (
SELECT @ID AS catelogID, catelogName AS RootCatelogName, CatelogID AS RootParentID
UNION
SELECT CatelogID, catelogName AS RootCatelogName, ParentID AS RootParentID
) t
WHERE ParentID IS NULL;
返回
catelogID RootCatelogName RootParentID
2 Library NULL
6 Library 2
catelogID RootCatelogName RootParentID
1 Embedded Sytem NULL
2 Library NULL
3 Library 2
4 Library 2
5 Library 2
6 Library 2
7 Embedded Sytem 1
8 College NULL
编辑
回答第二个问题的查询
WITH h AS (
SELECT CatelogID AS leafId, CatelogID, catelogName, ParentID
FROM catelog
WHERE ParentID IS NOT NULL
UNION ALL
SELECT h.leafId, p.CatelogID, p.catelogName, p.ParentID
FROM h
JOIN catelog p ON p.CatelogID = h.ParentID
)
SELECT leafId AS catelogID, catelogName AS RootCatelogName, CatelogID AS RootParentID
FROM h
WHERE ParentID IS NULL
UNION ALL
SELECT CatelogID,catelogName,ParentID
FROM catelog
WHERE ParentID IS NULL
ORDER BY CatelogID;
返回
catelogID RootCatelogName RootParentID
2 Library NULL
6 Library 2
catelogID RootCatelogName RootParentID
1 Embedded Sytem NULL
2 Library NULL
3 Library 2
4 Library 2
5 Library 2
6 Library 2
7 Embedded Sytem 1
8 College NULL
使用递归CTE和行数获取顶层: 返回:
CatelogID RootCatelogName RootParentID
2 Library NULL
6 Library 2
你能检查一下你的例子吗?如果我没弄错的话,6应该从段落开始生成一个结果集,然后将各章转到第一级。。。此外,库并没有父级-所以你们的输出看起来有点奇怪。我真的试图理解这里的逻辑,但我不能…不可能!!我尝试了很多次去理解它,但是我不能,RootCatelogName和RootParentID来自哪里?@CategoryID是Identity列。我们的期望似乎是使用CatergoryId查询记录及其根记录或顶级父记录请澄清您的具体问题或提供其他详细信息,以突出显示您所需的内容。正如目前所写的,很难准确地说出你的要求,编辑你的帖子以更具体地说明你在寻找什么,并且一定要解决其他用户在评论中提出的任何问题。你怎么知道RootCatelogName和RootParentID是别名?@Sami我无法想象任何其他版本。非常感谢。如果我不传递任何值,我可以得到这样的输出吗?@CatelogID RootCatelogName RootParentID 1 Embedded Sytem NULL2 Library NULL 3 Library 2 4 Library 2 5 Library 2 6 Library 2 7 Embedded 1 8 College NULL请编辑您的问题以显示后面案例所需的输出。非常感谢@LukStorms。准确地获取我想要的数据。