Sql 在同一个表中的3个级别上进行一对多连接
我有一个带页面的表,这些页面有父页面,它们也是同一个表中的页面 为此示例,该表如下所示:Sql 在同一个表中的3个级别上进行一对多连接,sql,sql-server-2005,one-to-many,self-join,recursive-query,Sql,Sql Server 2005,One To Many,Self Join,Recursive Query,我有一个带页面的表,这些页面有父页面,它们也是同一个表中的页面 为此示例,该表如下所示: table: Pages PageId :Key PageParent :Foreign Key PageName 现在我的问题是,在创建菜单结构时,SQL是什么样子的,如: PageId PageParent PageName 1 NULL home 2 1 page_under_home1 5
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
以下是CTE上的MS链接:
您需要使用递归查询。您使用的是哪种SQL方言?我使用的是MS SQL server。什么版本?从2005年开始,您可以访问CTE,这将对您有所帮助。哈!我使用的是2005,所以它可能是有用的:D