Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql查询中查找记录的第n个子项_Sql_Sql Server - Fatal编程技术网

如何在sql查询中查找记录的第n个子项

如何在sql查询中查找记录的第n个子项,sql,sql-server,Sql,Sql Server,我有一个存储类别和子类别的表(自联接) 如何在sql查询中查找类别的第N个子项查找类别M的第N个子项(按类别ID排序): SELECT ParentCategoryId, , CategoryId AS [n-th child] FROM ( SELECT CategoryId , ParentCategoryId , ROW_NUMBER() OVER (PARTITION BY ParentCategoryId ORDER BY CategoryId) as Chil

我有一个存储类别和子类别的表(自联接)


如何在sql查询中查找类别的第N个子项

查找类别
M
的第N个子项(按类别ID排序):

SELECT ParentCategoryId,
  , CategoryId AS [n-th child]
FROM (
  SELECT CategoryId
    , ParentCategoryId
    , ROW_NUMBER() OVER (PARTITION BY ParentCategoryId ORDER BY CategoryId) as ChildNumber
  FROM Categories
) p
WHERE ChildNumber = %N
select  *
from    (
        select  row_number() over (order by c.CategoryId) as rn
        ,       c.*
        from    Categories p
        join    Categories c
        on      p.CategoryId = c.ParentCategoryId
        where   p.CategoryId = M
        )
where   rn = N

要查找类别
M
N
th子项(按类别ID排序),请执行以下操作:

select  *
from    (
        select  row_number() over (order by c.CategoryId) as rn
        ,       c.*
        from    Categories p
        join    Categories c
        on      p.CategoryId = c.ParentCategoryId
        where   p.CategoryId = M
        )
where   rn = N

像这样的怎么样

DECLARE @Categories TABLE(
        CategoryId INT, 
        CategoryName VARCHAR(20),
        ParentCategoryId INT
)

INSERT INTO @Categories SELECT 1, '1',NULL
INSERT INTO @Categories SELECT 2, '2',NULL

INSERT INTO @Categories SELECT 3, '1.3',1
INSERT INTO @Categories SELECT 4, '1.4',1

INSERT INTO @Categories SELECT 5, '1.3.5',3
INSERT INTO @Categories SELECT 6, '1.3.6',3
INSERT INTO @Categories SELECT 7, '1.3.6.7',6

INSERT INTO @Categories SELECT 8, '1.4.8',4

DECLARE @CatID INT,
        @NthLevel INT
SELECT  @CatID = 1,
        @NthLevel = 2

;WITH Vals AS (
        SELECT  *,
                1 AS CatLevel
        FROM    @Categories c 
        WHERE   CategoryId IS NULL
        UNION ALL
        SELECT  c.*,
                CatLevel + 1 AS CatLevel
        FROM    Vals v INNER JOIN
                @Categories c   ON  c.ParentCategoryId =  v.CategoryID
)
SELECT  *
FROM    Vals
WHERE   CatLevel = @NthLevel

这将递归地构建树结构,并将其限制在您要查找的树级别。

类似的内容如何

DECLARE @Categories TABLE(
        CategoryId INT, 
        CategoryName VARCHAR(20),
        ParentCategoryId INT
)

INSERT INTO @Categories SELECT 1, '1',NULL
INSERT INTO @Categories SELECT 2, '2',NULL

INSERT INTO @Categories SELECT 3, '1.3',1
INSERT INTO @Categories SELECT 4, '1.4',1

INSERT INTO @Categories SELECT 5, '1.3.5',3
INSERT INTO @Categories SELECT 6, '1.3.6',3
INSERT INTO @Categories SELECT 7, '1.3.6.7',6

INSERT INTO @Categories SELECT 8, '1.4.8',4

DECLARE @CatID INT,
        @NthLevel INT
SELECT  @CatID = 1,
        @NthLevel = 2

;WITH Vals AS (
        SELECT  *,
                1 AS CatLevel
        FROM    @Categories c 
        WHERE   CategoryId IS NULL
        UNION ALL
        SELECT  c.*,
                CatLevel + 1 AS CatLevel
        FROM    Vals v INNER JOIN
                @Categories c   ON  c.ParentCategoryId =  v.CategoryID
)
SELECT  *
FROM    Vals
WHERE   CatLevel = @NthLevel

这将递归地构建树结构,并将其限制在您要查找的树级别。

+1现在问题被编辑为“第n个孩子/孩子”,这个答案更有意义:)+1现在问题被编辑为“第n个孩子/孩子”,这个答案更有意义:)抱歉,这不起作用。我不是在寻找表中的第n个记录,我需要的是一个类别的第n个孩子,我相信它正是这样做的。它为表中的每个ParentCategoryId返回第n个子项。我再次尝试了此操作,但没有成功。它只是ParentId上的分区。无论如何,非常感谢你的帮助。对不起,这没用。我不是在寻找表中的第n个记录,我需要的是一个类别的第n个孩子,我相信它正是这样做的。它为表中的每个ParentCategoryId返回第n个子项。我再次尝试了此操作,但没有成功。它只是ParentId上的分区。无论如何,非常感谢你的帮助