У меня есть эта таблица со страницами, у этих страниц есть родители, которые также являются страницами в той же таблице.
Для этого примера таблица выглядит так:
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
но это почти не создает желаемого результата, и я думаю, что я делаю это совершенно неправильно ...
EDIT:
это то, что у меня сейчас есть:
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