2010-07-23 16 views
0

J'ai ce tableau avec des pages, ces pages ont des parents qui sont aussi des pages dans la même table.un à plusieurs rejoindre sur 3 niveaux tous sur la même table

Pour ce saké exemples de la table ressemble à:

table: Pages 
PageId :Key 
PageParent :Foreign Key 
PageName 

Maintenant, ma question est qu'est-ce que l'apparence SQL comme lors de la création d'un Arborescence des menus comme:

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 

J'ai actuellement ceci:

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 

mais cela ne fait pas presque créer la sortie que je veux et je pense que je vais à compl etely dans le mauvais sens ...

EDIT:

c'est ce que j'ai actuellement:

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 

Et il semble fonctionner un peu, mais pas complètement reproduit, la première récursion semble fonctionner mais on dirait qu'il ne le fait pas une seconde fois.

Résultat:

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

Vous devez utiliser des requêtes récursives. Quel dialecte de SQL utilisez-vous? –

+0

J'utilise MS SQL Server pour cela –

+0

Quelle version? À partir de 2005, vous aurez accès à des CTE qui vous aideront. – spinon

Répondre