我有一张如下表:
Id | LinkSlug | ParentPageId | Order |
---|---|---|---|
1 | home | 0 | |
2 | page2 | 1 | |
3 | page3 | 2 | |
4 | page11 | 1 | 0 |
5 | page12 | 1 | 1 |
6 | page13 | 1 | 2 |
7 | page21 | 2 | 0 |
8 | page22 | 2 | 1 |
9 | page121 | 5 | 0 |
10 | page122 | 5 | 1 |
11 | page123 | 5 | 2 |
我相信您已经看到了模式-每个Page
可以有ParentPageId
定义的任意数量的"子页面"
我一直在try 获取一个可以生成以下有序输出的查询(不使用LinkSlug
个字母顺序,因为它们可以是任何内容):
Id | LinkSlug | ParentPageId | Order |
---|---|---|---|
1 | home | 0 | |
4 | page11 | 1 | 0 |
5 | page12 | 1 | 1 |
9 | page121 | 5 | 0 |
10 | page122 | 5 | 1 |
11 | page123 | 5 | 2 |
6 | page13 | 1 | 2 |
2 | page2 | 1 | |
7 | page21 | 2 | 0 |
8 | page22 | 2 | 1 |
3 | page3 | 2 |
我try 了一些自连接和分组,但最终只有一级递归,因此对第三级和可能的第n级子页没有好处,然后还try 使用CTE,因为我知道它们对递归查询很好,但不知何故最终生成了我开始使用的同一个表,现在不知所措!
我越是try ,情况就越糟-我知道我需要有效地 Select 按[顺序]排序的顶层(ParentPageId为null),然后在有子页按[顺序]排序的地方注入,并重复操作,直到没有子页-但不知道如何在SQL中做到这一点.
这是提琴脚本以防万一:
CREATE TABLE [Pages](
[Id] [int] IDENTITY(1,1) NOT NULL,
[LinkSlug] [nvarchar](450) NOT NULL,
[ParentPageId] [int] NULL,
[Order] [int] NOT NULL
);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (1, 'home', NULL, 0);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (2, 'page2', NULL, 1);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (3, 'page3', NULL, 2);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (4, 'page11', 1, 0);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (5, 'page12', 1, 1);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (6, 'page13', 1, 2);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (7, 'page21', 2, 0);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (8, 'page22', 2, 1);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (9, 'page121', 5, 0);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (10, 'page122', 5, 1);
INSERT into [Pages] ([Id], [LinkSlug], [ParentPageId], [Order]) VALUES (11, 'page123', 5, 2);