2014-08-27 44 views
0

我需要得到一個子項目的根PageID,實際上我的情況是菜單項。如何獲得產品或菜單的根parentID項目

我有一個表結構如下 [PageId], [PageName], [PagePath], [PageInheritance]

我要的是一個SQL查詢,將讓我PageID如果用戶選擇2級或3級菜單項。這樣我可以處處彰顯父菜單不論其級別

的,例如,如果PAGEID = 6那麼就應該讓我的根PAGEID爲2

我也試圖爲這個頁面設置SQL小提琴,但它由於某種原因失敗。

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

這是一個挑戰,因爲你不想要的 「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小提琴

+0

我同意你,但是我設法使之與實例的參考工作由魯斯蘭http://stackoverflow.com提到/問題/ 25360890/SQL-如何對獲得最頂級的家長-A-給定值-IN-A自參照表的。我也在看你的例子 – Learning 2014-08-27 11:32:10

+0

這就是我所做的http://rextester.com/IXEKB9577 – Learning 2014-08-27 11:38:57

相關問題