2013-04-14 39 views
0

CTE的結果存儲在變量表名稱@tbl中。如何設置層次表中項目的「順序」?

我想通過MenuItemID,ParentID(PID)和MenuID設置MenuItems的順序(SO)。爲此,我嘗試使用Cursor,但對於我來說這太複雜了。

編輯: 事實上樣本數據的SO(順序)是爲了不,因爲它們應該被連續地進行。我想重新設置他們的訂單在層次和SO當前:

當前SO(不連續):

1 5 2 9 10 6 7 

更正:

1 2 1 2 3 3 4 

> 1 
> 2 
    > 1 
    > 2 
    > 3 
> 3 
> 4 

@tbl內容:

MenuItemID        ParentID        MenuID         SO Level 
D3B92D1B-7AFA-4E11-AF01-9F6A00B1B2A9 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 1 0 
F5833F72-A739-47D6-B30C-A19600F03E91 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 5 0 
5C2AC1F8-DEE0-448B-B538-A19600F0839B C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 6 0 
3A1096E7-5FD2-4F77-9729-A19600973BDF C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 7 0 
EBB5FFF0-4407-436B-BCE8-A1A0010A1A88 F5833F72-A739-47D6-B30C-A19600F03E91 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 2 1 
45077C15-3A47-43E2-92A1-A19C013C2D9C F5833F72-A739-47D6-B30C-A19600F03E91 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 9 1 
9DDB77B9-C9E8-48AF-8F1E-A1960097329A F5833F72-A739-47D6-B30C-A19600F03E91 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 10 1 

而我想要的結果是這樣的:

(該的MenuItems應該由級別進行排序,SO(排序))

MenuItemID        ParentID        MenuID         SO Level 
D3B92D1B-7AFA-4E11-AF01-9F6A00B1B2A9 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 1 0 
F5833F72-A739-47D6-B30C-A19600F03E91 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 2 0 
EBB5FFF0-4407-436B-BCE8-A1A0010A1A88 F5833F72-A739-47D6-B30C-A19600F03E91 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 1 1 
45077C15-3A47-43E2-92A1-A19C013C2D9C F5833F72-A739-47D6-B30C-A19600F03E91 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 2 1 
9DDB77B9-C9E8-48AF-8F1E-A1960097329A F5833F72-A739-47D6-B30C-A19600F03E91 C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 3 1 
5C2AC1F8-DEE0-448B-B538-A19600F0839B C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 3 0 
3A1096E7-5FD2-4F77-9729-A19600973BDF C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E C0489C0C-18C7-4D9A-8FC2-A19A00CDB99E 4 0 

光標我是打算用是這樣的,但我不知道該怎麼用它做:

declare @id uniqueidentifier 
declare cur CURSOR LOCAL for 
    SELECT MenuItemID FROM @tbl order by lvl 
open cur 
    fetch next from cur into @id 
    while @@FETCH_STATUS = 0 BEGIN 
     ??? 
    fetch next from cur into @id 
    end 
close cur 
deallocate cur 

這裏是表(@tbl)結構:

declare @tbl table (MenuItemID uniqueidentifier, PID uniqueidentifier, MenuID uniqueidentifier, SO tinyint, lvl tinyint) 

,如果有人幫助我,我會高度讚賞。

由於提前,

Kardo

+0

示例結果中的排序順序與給定的順序(Level,SO)不匹配,也沒有任何其他順序可以看到。你能澄清你試圖達到什麼樣的順序嗎?此外,結果中的SO值與數據中的值不匹配 - 您能否澄清您是否要在結果中使用不同的SO值,以及如果是這樣,如何得出它們? –

+0

我完全不理解你,但在本例中PID ='F5833F72-A739-47D6-B30C-A19600F03E91',SO = 2的項目是該項目的子項,因此按1,2,3排序。 – Kardo

+0

@ MarkBannister,我編輯了我的問題。希望這更清楚。 – Kardo

回答

1

使用遞歸CTE,而不是光標:

with hier as 
(select l0.*, convert(varchar(max),right('000'+convert(varchar(3),SO),3)) FullSO 
from tbl l0 where lvl=0 
union all 
select ln.*, lp.FullSO+','+right('000'+convert(varchar(3),ln.SO),3) FullSO 
from tbl ln 
join hier lp on ln.PID = lp.MenuItemID) 
select MenuItemID, 
     PID, 
     MenuID, 
     rank() over (partition by PID order by SO) SO, 
     lvl 
from hier 
order by FullSO, SO 

SQLFiddle here

+0

完美!非常感謝好友!我測試了我的方法,但它在多子類別中不成功,但是您的工作正常。再次感謝:) – Kardo

+0

@Kardo:很高興我能幫上忙。 :) –

+0

嘿馬克,請你看看我的回答(其實問題)嗎? – Kardo

相關問題