【问题标题】:ordering a self-referencing table by DFS search in sql在 sql 中通过 DFS 搜索对自引用表进行排序
【发布时间】:2014-12-18 19:39:40
【问题描述】:

我有一个自引用表,它代表如下一些数据:

    declare @table table( 
    ID int,
    ParentID int,
    Name varchar(50),
    levelNode int
)
declare @Temptable table( 
    ID int,
    ParentID int,
    Name varchar(50),
    levelNode int
)
declare @maxlevel int

insert into @table (ID,ParentID,Name,levelNode) select 11,null,'A',1
insert into @table (ID,ParentID,Name,levelNode) select 12,11,'B-1',2
insert into @table (ID,ParentID,Name,levelNode) select 13,11,'B-2',2
insert into @table (ID,ParentID,Name,levelNode) select 14,12,'B-1-1',3
insert into @table (ID,ParentID,Name,levelNode) select 15,12,'B-1-2',3
insert into @table (ID,ParentID,Name,levelNode) select 16,12,'B-1-3',3
insert into @table (ID,ParentID,Name,levelNode) select 17,13,'B-2-1',3
insert into @table (ID,ParentID,Name,levelNode) select 18,13,'B-2-2',3
insert into @table (ID,ParentID,Name,levelNode) select 19,13,'B-2-3',3
insert into @table (ID,ParentID,Name,levelNode) select 20,19,'B-2-3-1',4
insert into @table (ID,ParentID,Name,levelNode) select 21,19,'B-2-3-2',4
insert into @table (ID,ParentID,Name,levelNode) select 22,17,'B-2-1-1',4
insert into @table (ID,ParentID,Name,levelNode) select 23,17,'B-2-1-2',4

declare @ID int
select @ID=11;
With ret AS(
    select * from @table
    where ID=@ID
    union all
    select t.* from @table t inner join ret r ON t.ParentID=r.ID 
)

insert into @Temptable select * from ret where ID<>@ID
order by ??????????????????

select * from @Temptable

我想这样订购它们:

我应该按部分顺序写什么!

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012


    【解决方案1】:

    试试这个..

    Fiddle demo

    INSERT INTO @Temptable 
    SELECT * 
    FROM   ret 
    WHERE  id <> @ID 
    ORDER  BY Substring(NAME, 3, 1), 
              Substring(NAME, 5, 1), 
              Substring(NAME, 7, 1) 
    

    【讨论】:

    • 非常感谢您的帮助,但名称是象征性的,它们只是显示此特定示例中的关系...实际上它们是项目的名称...我选择了这个名称来制作我的问题更清楚......我应该找到一个基于IdParentId(如果需要,还有level)的答案。
    • @mj-y 根据您的预期结果,我不知道如何使用 Id 和 parentId 进行排序。您的输出中没有顺序
    • 自引用表,父id为当前表中一行的id。如果您遵循 ids 和 parents,您可以创建表数据的树。我想对这个表数据进行(DFS: Depth first search) 排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多