SQL Server 存储过程 - 如何以树格式对记录进行排序?

博格巴

我有一个包含这些记录的表:

+----+-------------+---------+
| ID | Name        | ParentID|
+----+-------------+---------+
|  1 | Item 1      |   -1    |
|  2 | Item 2      |   -1    |
|  3 | Item 1.1    |    1    |
|  4 | Item 1.2    |    1    |
|  5 | Item 2.1    |    2    |
|  6 | Item 1.1.1  |    3    |
|  7 | Item 1.2.1  |    4    |
|  8 | Item 2.2    |    2    |
|  9 | Item 1.1.1.1|    6    |
+----+-------------+---------+

我想选择树格式的记录。

如何使用存储过程获得如下表所示的结果?Name的值是临时的,可以是任何字。

+----+-------------+---------+
| ID | Name        | ParentID|
+----+-------------+---------+
|  1 | Item 1      |   -1    |
|  3 | Item 1.1    |    1    |
|  6 | Item 1.1.1  |    3    |
|  9 | Item 1.1.1.1|    6    |
|  4 | Item 1.2    |    1    |
|  7 | Item 1.2.1  |    4    |
|  2 | Item 2      |   -1    |
|  5 | Item 2.1    |    2    |
|  8 | Item 2.2    |    2    |
+----+-------------+---------+

对不起,我是存储过程的初学者。所以我不知道如何得到上表的结果。

感谢您阅读

三伏

我认为父节点必须在其子节点之前。这是我的查询

DECLARE @SampleData AS TABLE( ID int,  Name   varchar(20)  , ParentID int)

INSERT INTO @SampleData VALUES (  1 ,' Item 1',   -1    )
INSERT INTO @SampleData VALUES ( 2 ,' Item 2'      ,   -1    )
INSERT INTO @SampleData VALUES (  3 ,' Item 1.1'    ,    1    )
INSERT INTO @SampleData VALUES (  4 ,' Item 1.2'    ,    1    )
INSERT INTO @SampleData VALUES (  5 ,' Item 2.1'    ,   2    )
INSERT INTO @SampleData VALUES (  6 ,' Item 1.1.1'  ,   4    )
INSERT INTO @SampleData VALUES (  7 ,' Item 1.2.1'  ,    6    )
INSERT INTO @SampleData VALUES (  8 ,' Item 2.2'    ,    2    )

;with cte as (
    select t.Id, t.Name, t.ParentID, 1 as lev, t.Id AS RootId
    from @SampleDAta t
    where t.ParentID = -1
    union all
    select t.ID, t.Name,t.ParentID,cte.lev +1, cte.RootId 
    from cte 
    INNER JOIN @SampleDAta t on t.ParentID = cte.Id
    )
SELECT c.Id, c.Name, c.ParentID FROM cte c
ORDER BY c.RootId, c.lev  
OPTION (MAXRECURSION 0)

结果:

在此处输入图片说明

如果你想像深度搜索树一样排序,我可以通过一个函数来完成

CREATE TABLE SampleData ( ID int,  Name   varchar(20)  , ParentID int)

INSERT INTO SampleData VALUES (  1 ,' Item 1',   -1    )
INSERT INTO SampleData VALUES ( 2 ,' Item 2'      ,   -1    )
INSERT INTO SampleData VALUES (  3 ,' Item 1.1'    ,    1    )
INSERT INTO SampleData VALUES (  4 ,' Item 1.2'    ,    1    )
INSERT INTO SampleData VALUES (  5 ,' Item 2.1'    ,   2    )
INSERT INTO SampleData VALUES (  6 ,' Item 1.1.1'  ,   3    )
INSERT INTO SampleData VALUES (  7 ,' Item 1.2.1'  ,    4    )
INSERT INTO SampleData VALUES (  8 ,' Item 2.2'    ,    2    )

现在创建函数

CREATE FUNCTION DisplayTree
(
    @RootId int
)
RETURNS 
@result TABLE (
    ID int,  Name   varchar(20)  , ParentID int
    )
AS
BEGIN
    DECLARE @Temp AS TABLE 
    (
        ID int,  Name   varchar(20)  , ParentID int
    )
    INSERT INTO @Temp SELECT * FROM SampleData WHERE ParentID = @RootId

    WHILE(EXISTS(SELECT 1 FROM @Temp t))
    BEGIN
        DECLARE @CurrentRootId int
        SELECT TOP 1 @CurrentRootId = t.ID FROM @Temp t ORDER BY t.ID ASC
        INSERT INTO @result SELECT * FROM @Temp t WHERE t.ID = @CurrentRootId
        DELETE FROM @Temp WHERE ID = @CurrentRootId

        INSERT INTO @result SELECT * FROM dbo.DisplayTree(@CurrentRootId)
    END

    RETURN ;
END
GO

AND 执行函数

SELECT * FROM dbo.DisplayTree(-1) 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server存储过程追加参数格式

来自分类Dev

针对存储过程SQL Server进行SELECT

来自分类Dev

如何使用SQL Server存储过程?

来自分类Dev

SQL Server存储过程参数

来自分类Dev

sql server存储过程IN参数

来自分类Dev

执行SQL Server存储过程

来自分类Dev

SQL Server存储过程参数

来自分类Dev

SQL Server存储过程选择

来自分类Dev

Laravel SQL Server 存储过程

来自分类Dev

SQL Server 存储过程优化

来自分类Dev

SQL Server 存储过程问题

来自分类Dev

SQL Server存储过程正在插入两条记录

来自分类Dev

排序规则冲突 SQL Server varchar 存储过程参数

来自分类Dev

如何获取sql server存储过程结果以在其他存储过程中处理?

来自分类Dev

如何捕获SQL Server存储过程中的错误?

来自分类Dev

如何更正存储过程错误#1934?(SQL Server / PHP)

来自分类Dev

如何在SQL Server存储过程中使用if / else

来自分类Dev

如何向/从SQL Server存储过程发送和接收参数

来自分类Dev

如何使用Hibernate con Sql Server 2000调用存储过程?

来自分类Dev

如何在联接语句SQL Server中执行存储过程

来自分类Dev

如何在SQL Server Management Studio中创建存储过程

来自分类Dev

如何使用存储过程从SQL Server获取数据

来自分类Dev

如何在SQL Server中检查调用存储过程

来自分类Dev

如何用SQL Server存储过程填充组合框

来自分类Dev

如何从SQL Server存储过程读取数据表

来自分类Dev

如何在SQL Server中编写存储过程

来自分类Dev

如何在SQL Server中搜索1000个存储过程

来自分类Dev

如何使用SQL Server 2008中的存储过程

来自分类Dev

如何在SQL Server中备份存储过程?