如何获取产品或菜单项的根parentID

时间:2014-08-27 10:40:40

标签: sql sql-server sql-server-2008

我需要获取子项的根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)
;

我的解决方案:http://rextester.com/IXEKB9577

1 个答案:

答案 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小提琴