我想基于第1级对名称进行排序(仅对适用的root id进行排序为null或level == 1)。如果我根据名称进行搜索,则结果集会破坏父子关系。
我有50万条记录。明智地做这种表现的最佳方式是什么?
ID PARENT ID ROOT ID NAME level
===============================================
1 NULL NULL FIRST 1
2 1 1 SECOND 2
3 2 1 THIRD 3
4 1 1 FORTH 4
5 4 1 FIFTH 5
6 NULL NULL SIXTH 1
7 6 6 SEVENTH 2
8 7 6 EIGHTH 2
9 NULL NULL NINTH 1
10 NULL NULL TENTH 1
11 NULL NULL ELEVEN 1
12 11 11 TWELVE 2
13 12 11 THIRTEEN 3
14 13 11 FOURTEEN 4
预期输出 - 按名称ASC排序
ID PARENT ID ROOT ID NAME level
===============================================
11 NULL NULL ELEVEN 1
12 11 11 TWELVE 2
13 12 11 THIRTEEN 3
14 13 11 FOURTEEN 4
1 NULL NULL FIRST 1
2 1 1 SECOND 2
3 2 1 THIRD 3
4 1 1 FORTH 4
5 4 1 FIFTH 5
9 NULL NULL NINTH 1
6 NULL NULL SIXTH 1
7 6 6 SEVENTH 2
8 7 6 EIGHTH 2
10 NULL NULL TENTH 1
答案 0 :(得分:1)
您可以使用LEFT JOIN
获取父母的姓名,然后使用父母的姓名ORDER
:
SELECT t1.ID, t1.[PARENT ID], t1.[ROOT ID], t1.NAME, t1.level
FROM mytable AS t1
LEFT JOIN mytable AS t2 ON t2.ID = t1.[ROOT ID]
ORDER BY COALESCE(t2.NAME, t1.NAME), t1.level
如果父名称不可用,则表示当前行是父本身。因此,使用行的NAME
字段来进行排序。
最后,属于同一父级的记录按level
排序。
答案 1 :(得分:1)
您希望按两个键对结果进行排序:
首先,与每行关联的根行的NAME
列(可能是该行本身)和
第二,level
列。
您可以通过将表连接到自身来实现此目的,以建立根 - NAME
关联。例如,
select a.*
from
my_table a
join my_table b
on isnull(a.[root id], a.id) = b.id
order by b.name, a.level
注意isnull()
- 尽管您通常希望基于b.id = a.[root id]
加入,但您需要避免排除root_id为NULL
的根行。使用isnull()
,您可以根据id
加入这些行(即。您将它们加入到自己中)。
答案 2 :(得分:0)
这应该会给你我认为你正在寻找的东西:
SELECT
id,
parent_id,
root_id,
name,
level
FROM
Your_Table T1
INNER JOIN Your_Table T2 ON T2.id = T1.root_id
ORDER BY
T2.name,
T1.level