Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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/1/angularjs/22.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查询_Sql_Sql Server - Fatal编程技术网

树表菜单的SQL查询

树表菜单的SQL查询,sql,sql-server,Sql,Sql Server,我有一个树状结构的表: ID Title ParentID Orderby ---------------------------------------- 1 All 0 2 2 Banking 1 5 3 USAA Checking 0 0 4 USAA Mastercard 1 9 5

我有一个树状结构的表:

ID    Title           ParentID     Orderby 
----------------------------------------
1     All             0            2
2     Banking         1            5
3     USAA Checking   0            0
4     USAA Mastercard 1            9
5     Medical         3            0
6     Jobs            3            100
7     Archive         0            1
8     Active          7            0  
9     BoA Amex        1            1
我需要编写一个SQL查询来生成如下结果(按列排序):


谁能帮我写一个SQL查询?谢谢

您可以使用
row\u number()

select Id,title, concat(val,'.',case when 
row_number() over(partition by val order by Id)-1=0 then null else 
row_number() over(partition by val order by Id)-1 end) as path,
orderby
from
(
select *,case when parentid=0 then id else parentid end as val
from Categories
)A

如果您有一个层次结构级别,可以尝试下面的查询

 Select  
      C.ID as ID, 
      C.Title  as Title, 
      Case 
        when C.ParentID =0 then cast(C.ID as  varchar(2)) 
        else cast(C.ParentID as varchar(2)) + '.' + cast(C.Order as varchar(3)) 
      END as Path, 
      C.Order 
  from Categories as C
如果有多级层次结构,则需要创建临时表。您需要更新订单,以便我们对所需的输出进行更简单的查询


谢谢

我们可以使用递归CTE进行此操作:

WITH children AS (
    SELECT NULL AS ParentID, ID, Title, Orderby,
        CAST(ID AS VARCHAR(500)) AS Path
    FROM Categories
    WHERE ParentID = 0

    UNION ALL

    SELECT 
       d.ParentID, t.counter + 1, d.ID, d.Title, d.Orderby,
       CAST(CAST(t.Path AS VARCHAR(50)) + '.' +
       CAST(ROW_NUMBER() OVER (PARTITION BY d.ParentID ORDER BY d.ID) AS VARCHAR(50)) AS VARCHAR(500))
    FROM children t
    INNER JOIN Categories AS d
        ON d.ParentID = t.ID
)

SELECT ID, Title, Path, Orderby
FROM children;


请注意,对于给定的父版本,您从未提供用于确定次要版本号的固定逻辑。也就是说,不清楚为什么
Medical
出现在层次结构中早于
Jobs

您应该解释您的逻辑考虑使用其他方法,您需要一个递归CTEE解释您如何计算
USAA万事达卡的路径
否,我不理解您的评论。请再次检查,我只是调整了一下问题,让它更容易理解,对不起,因为我的英语不太好
WITH children AS (
    SELECT NULL AS ParentID, ID, Title, Orderby,
        CAST(ID AS VARCHAR(500)) AS Path
    FROM Categories
    WHERE ParentID = 0

    UNION ALL

    SELECT 
       d.ParentID, t.counter + 1, d.ID, d.Title, d.Orderby,
       CAST(CAST(t.Path AS VARCHAR(50)) + '.' +
       CAST(ROW_NUMBER() OVER (PARTITION BY d.ParentID ORDER BY d.ID) AS VARCHAR(50)) AS VARCHAR(500))
    FROM children t
    INNER JOIN Categories AS d
        ON d.ParentID = t.ID
)

SELECT ID, Title, Path, Orderby
FROM children;