2010-07-23 152 views
0

我有這張帶有頁面的表格,這些頁面的父母也是同一張表格中的頁面。一對多加入同一張桌子上的3個級別

對於這個例子起見,表如下所示:

table: Pages 
PageId :Key 
PageParent :Foreign Key 
PageName 

現在我的問題是什麼將在SQL樣子創建menustructure時,如:

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 

但這幾乎不會創建我想要的輸出,我想我會去compl etely走錯了路......

編輯:

這是我目前有:

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 
+0

您需要使用遞歸查詢。您使用哪種SQL語言? – 2010-07-23 08:02:07

+0

我正在使用MS SQL server for – 2010-07-23 08:06:13

+0

什麼版本?從2005年開始,您可以使用CTE來幫助解決這個問題。 – spinon 2010-07-23 08:20:52

回答