我需要获取子项的根PageID
,在我的情况下实际上是菜单项。
我有一个表结构如下
[PageId], [PageName], [PagePath], [PageInheritance]
我想要的是一个SQL查询,如果用户选择2级或3级菜单项,它将获得PageID
。所以我总是可以突出显示父菜单,无论其级别如何
例如,如果PageID = 6那么它应该让我的Root PageID为2。
我也尝试为这个页面设置SQL Fiddle,但由于某种原因它失败了。
CREATE TABLE PageMenu
([PageId] int, [PageName] varchar(5), [PagePath] varchar(50), [PageInheritance] int)
;
INSERT INTO PageMenu
([PageId], [PageName], [PagePath], [PageInheritance])
VALUES
(1, 'Home', '/en/', 0),
(2, 'Menu1', '/en/Menu1/', 0),
(3, 'Child1', '/en/Menu1/Child1/', 2),
(4, 'Child1', '/en/Menu1/Child2/', 2),
(5, 'GrandChild1', '/en/Menu1/Child1/GrandChild1/', 4),
(6, 'GrandChild2', '/en/Menu1/Child1/GrandChild2/', 5)
;
答案 0 :(得分:1)
这有点挑战,因为你不想要“1”,而是“2”。所以,你想要第二级别,这使得这与大多数此类问题略有不同。以下是获得最高级别的一种方法:
select pm.*, t.PageId
from PageMenu pm cross apply
(select top 1 pm2.PageId
from PageMenu pm2
where pm.PageName like pm2.PageName + '%'
order by len(pm2.PageName)
) t;
然而,这返回“1”,而不是“2”。您可以通过简单过滤
来完成此操作select pm.*, t.PageId
from PageMenu pm cross apply
(select top 1 pm2.PageId
from PageMenu pm2
where pm.PagePath like pm2.PagePath + '%' and
pm2.PageName <> 'Home'
order by len(pm.PageName)
) t;
Here是一个SQL小提琴