我有这个带有页面的表,这些页面的父页面也是同一个表格中的页面。
对于这个例子,表格如下:
table: Pages
PageId :Key
PageParent :Foreign Key
PageName
现在我的问题是在创建类似的菜单结构时SQL会是什么样子:
PageId PageParent PageName
1 NULL home
2 1 page_under_home1
5 2 page_under_pageid2_1
6 2 page_under_pageid2_2
4 1 page_under_home2
5 4 page_under_pageid4_1
7 5 page_under_pageid5_1
6 4 page_under_pageid4_2
9 6 page_under_pageid6_1
10 6 page_under_pageid6_2
8 1 page_under_home3
11 1 page_under_home4
12 11 page_under_pageid11_1
13 12 page_under_pageid12_1
我目前有这个:
SELECT p1.PageId, p1.PageName, p1.PageParent, p2.PageName AS Expr1
FROM dbo.pages AS p1 FULL OUTER JOIN
(SELECT PageId, PageName
FROM dbo.pages
WHERE (PageParent IS NULL)) AS p2 ON p2.PageId = p1.PageParent
但这并不能创造出我想要的输出,而且我认为我的方式完全是错误的......
修改
这就是我现在所拥有的:
WITH
PagesMenu(pageId, PageParent, PageName)
AS
(
SELECT
PageId, PageParent, PageName
FROM
dbo.pages
WHERE
(PageParent IS NULL)
AND
(PageIsVisible = 'True')
UNION ALL
SELECT
b.PageId, b.PageParent, b.PageName
FROM
PagesMenu AS a
INNER JOIN
dbo.pages AS b
ON
a.pageId = b.PageParent
)
SELECT pageId, PageParent, PageName
FROM PagesMenu
它似乎有些工作,但没有完全重复,第一次递归似乎有效,但看起来它不会再次这样做。
结果:
pageId PageParent PageName
3 NULL home
1 3 test
4 3 test
5 4 test
6 4 test
7 4 test
8 5 test <---wrong
2 1 test <---wrong