У меня есть один большой запрос на производительность, связанный с 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 .