我需要根据pageID
为任何页面生成面包屑。下面是基于MS Sql server的示例数据样本sql script
。
CREATE TABLE PageMenu
([PageId] int, [PageName] varchar(5), path varchar(100), [PageInheritance] int)
;
INSERT INTO PageMenu
([PageId], [PageName], [path], [PageInheritance])
VALUES
(1, 'Home', '/en/', 0),
(2, 'About Us', '/en/about-us/', 0),
(3, 'Our Mission', '/en/about-us/our-mission/', 2),
(4, 'Our Vision', '/en/about-us/our-vision/', 2),
(5, 'Media', '/en/media/', 0),
(6, 'Press Release', '/en/media/press-releases/', 5),
(7, 'Video Gallery', '/en/media/video-gallery/', 5),
(8, 'Products', '/en/products/', 0),
(9, 'Mens', '/en/products/mens/', 8),
(10, 'Womens', '/en/products/womens/', 8),
(11, 'Footwear', '/en/products/footwear/', 9),
(12, 'Footwear', '/en/products/footwear/', 10),
(13, 'Shoes', '/en/products/mens/footwear/shoes/', 9),
(14, 'Sandals', '/en/products/mens/footwear/sandals/', 9),
(15, 'Kids', '/en/products/kids/', 8)
;
我想创建一个基于CTE的存储过程,我希望传递pageid
,它应该以面包屑的形式递归返回页面的路径
如果我通过并pageid=11
,那么它应该返回以下格式的行
pageid_____PageName________Path
1 Home /en/
8 Products /en/products/
9 Mens /en/products/mens/
11 Footwear /en/products/mens/footwear/
根据上面的结果集,我可以生成如下面的痕迹
Home > Products > Mens > Footwear
答案 0 :(得分:1)
这是我找到的解决方案:
;WITH RecursiveTable (PageId, PageName, Path, PageInheritance, Level)
AS(
--Anchor
SELECT tt.PageId, tt.PageName, tt.Path, tt.PageInheritance, 0 AS Level
FROM pg_Menu AS tt
WHERE PageId = 13
UNION ALL
--Recursion
SELECT tt.PageId, tt.PageName, tt.Path, tt.PageInheritance, Level + 1
FROM pg_Menu AS tt
INNER JOIN RecursiveTable rt ON rt.PageInheritance = tt.PageId
)
SELECT * FROM RecursiveTable ORDER BY Level DESC
PageID = 13
pageid_____PageName________Path
8 Products /en/products/
9 Mens /en/products/mens/
11 Footwear /en/products/mens/footwear/
13 Shoes /en/products/mens/footwear/shoes/
更新:小提琴示例http://sqlfiddle.com/#!3/e4ce3/2