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