基于父名

时间:2016-03-11 14:34:08

标签: sql sql-server

我想基于第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

3 个答案:

答案 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)

您希望按两个键对结果进行排序:

  1. 首先,与每行关联的根行的NAME列(可能是该行本身)和

  2. 第二,level列。

  3. 您可以通过将表连接到自身来实现此目的,以建立根 - 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