2010-08-17 136 views
1

我有一個在SQL Server相關的性能的一個大查詢2005年我在SQL Server相關的性能的一個大查詢2005

我有這樣

id parentId 
1 null 
2 1 
3 1 
4 2 
5 4 
6 3 

我想爲了使數據通過與parentId的下線和id明智 像

id Order 
1 1 
2 2 
4 3 
5 4 
3 5 
4 6 

我不想使用循環,因爲循環是建立高,如果行數的問題記錄。 請給我簡單的方法來做到這一點,並傷害到性能。

更新, 請運行下面

 

create table [mytable] ( [id] int, [parentId] int ) GO

INSERT INTO [mytable] ([id],[parentId])VALUES(1,NULL) INSERT INTO [mytable] ([id],[parentId])VALUES(2,6) INSERT INTO [mytable] ([id],[parentId])VALUES(4,9) INSERT INTO [mytable] ([id],[parentId])VALUES(5,4) INSERT INTO [mytable] ([id],[parentId])VALUES(6,13) INSERT INTO [mytable] ([id],[parentId])VALUES(7,13) INSERT INTO [mytable] ([id],[parentId])VALUES(8,5) INSERT INTO [mytable] ([id],[parentId])VALUES(9,1) INSERT INTO [mytable] ([id],[parentId])VALUES(13,1) GO

; WITH q AS ( SELECT id, parentId, CAST(id AS VARCHAR(MAX)) + '/' AS path FROM mytable WHERE parentId IS NULL UNION ALL SELECT t.id, t.parentId, q.path + CAST(t.id AS VARCHAR(MAX)) + '/' FROM q JOIN mytable t ON t.parentId = q.id ) SELECT *, ROW_NUMBER() OVER (ORDER BY path) AS rn FROM q ORDER BY path GO

The result of this query ID ParentId Path rn 1 NULL 1/ 1 13 1 1/13/ 2 6 13 1/13/6/ 3 2 6 1/13/6/2/ 4 7 13 1/13/7/ 5 9 1 1/9/ 6 4 9 1/9/4/ 7 5 4 1/9/4/5/ 8 8 5 1/9/4/5/8/ 9

的劇本,但我想從avove結果第1,那麼1/9 then1/9/...然後1/13/RN然後將結果1/13/...。請給我解決方案。

我想導致像

 


ID ParentId Path  rn 
1 NULL 1/  1 
13 1 1/13/  6 
6 13 1/13/6/  7 
2 6 1/13/6/2/ 8 
7 13 1/13/7/  9 
9 1 1/9/   2 
4 9 1/9/4/  3 
5 4 1/9/4/5/  4 
8 5 1/9/4/5/8/ 5 

 

 


WITH q AS 
     ( 
     SELECT id, parentId, CAST(id AS VARCHAR(MAX)) AS path 
     FROM mytable 
     WHERE parentId IS NULL 
     UNION ALL 
     SELECT t.id, t.parentId, q.path + '/' + CAST(t.id AS VARCHAR(MAX)) 
     FROM q 
     JOIN mytable t 
     ON  t.parentId = q.id 
     ) 
SELECT *, ROW_NUMBER() OVER (ORDER BY path) AS rn 
FROM q 
ORDER BY 
     path 

 

在上面 有一個問題。 您正在使用路徑順序 的順序,假設在記錄如1/13和1/2的情況下,所以順序依次爲1/13和1/2,但我想要順序1/2然後是1/13,因爲2是小於13

+1

ORDER BY順序,編號? – JonH 2010-08-17 14:52:19

+3

我認爲您的預期結果存在拼寫錯誤。如果最後的ID是6而不是4? – 2010-08-17 14:53:55

回答

3
WITH q AS 
     (
     SELECT id, parentId, CAST(id AS VARCHAR(MAX)) + '/' AS path 
     FROM mytable 
     WHERE parentId IS NULL 
     UNION ALL 
     SELECT t.id, t.parentId, q.path + CAST(t.id AS VARCHAR(MAX)) + '/' 
     FROM q 
     JOIN mytable t 
     ON  t.parentId = q.id 
     ) 
SELECT *, ROW_NUMBER() OVER (ORDER BY path) AS rn 
FROM q 
ORDER BY 
     path 
+1

你能解釋一下我對你從哪裏得到這個問題感到困惑嗎? – msarchet 2010-08-17 14:57:26

+0

@msarchet:這是一個呈現爲鄰接列表的層次結構。 @op希望按照樹形順序查找每個條目的位置。 – Quassnoi 2010-08-17 15:03:12

+0

謝謝,它確實有效。 – Paresh 2010-08-17 15:06:14

0

我不能告訴你準確的數據庫是什麼樣子,但這樣的事情應該工作

Select id, [Order] From Table1 Order By Order, id 
0
select id, parentid as order from table 
order by coalesce(parentid, 9999), id