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
Vous devez utiliser des requêtes récursives. Quel dialecte de SQL utilisez-vous? –
J'utilise MS SQL Server pour cela –
Quelle version? À partir de 2005, vous aurez accès à des CTE qui vous aideront. – spinon