Sql 获取子行及其上根行,并以特殊方式组合ID和名称

Sql 获取子行及其上根行,并以特殊方式组合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

当我发送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)
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。准确地获取我想要的数据。