У меня есть один большой запрос на производительность, связанный с SQL Server 2005 - PullRequest
1 голос
/ 17 августа 2010

У меня есть один большой запрос на производительность, связанный с SQL Server 2005.

У меня есть такие данные

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

Я хочу заказать записи по нижестоящим с parentId и id wise как

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

Я не хочу использовать цикл, потому что цикл создает проблему, если большое количество строк. Пожалуйста, дайте мне простой способ сделать это и ухудшить производительность.

Обновлен, Пожалуйста, запустите скрипт ниже

 </p>

<p>create table [mytable]
(
[id] int,
[parentId] int
) 
GO</p>

<p>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</p>

<p>; 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</p>

<p>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</p>

<p>
  

Но я хочу получить результат для rn из avove, сначала 1, затем 1/9, затем 1/9 / ..., затем 1/13, затем 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 .

Ответы [ 3 ]

3 голосов
/ 17 августа 2010
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
0 голосов
/ 17 августа 2010
select id, parentid as order from table 
order by coalesce(parentid, 9999), id
0 голосов
/ 17 августа 2010

Я не могу точно сказать, как выглядит ваша база данных, но что-то вроде этого должно работать

Select id, [Order] From Table1 Order By Order, id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...