SQL-按顺序选择父记录和子记录

Jam*_*mes 4 sql t-sql sql-server join common-table-expression

我有一个表,在同一表中同时具有问题ID和父问题ID:

QUES_ID | Ques_Txt  | Parent_Ques_Id
--------+-----------+---------+---------------
     97  |  X       | NULL
     101 |  Y       | NULL
     115 |  Z       | NULL
     198 |  A       | 97
     302 |  B       | 97
     151 |  C       | 101
     91  |  D       | 115
   1110  |  E       | 115
   1111  |  F       | 115
Run Code Online (Sandbox Code Playgroud)

现在,我想按以下顺序获取结果集:

QUES_ID | Ques_Txt  | Parent_Ques_Id
--------+-----------+---------+---------------
     97  |  X       | NULL
     198 |  A       | 97
     302 |  B       | 97
     101 |  Y       | NULL
     151 |  C       | 101
     115 |  Z       | NULL         
     91  |  D       | 115
   1110  |  E       | 115
   1111  |  F       | 115
Run Code Online (Sandbox Code Playgroud)

在子问题的正上方列出了父问题,我已经研究了一个类似的查询,但是我发现的全部是如何使用左联接或CTE显示父子记录,而不是按照我在上面查找的顺序表。谁能帮忙,我还在学习。

Kam*_*ski 7

您可以使用以下技巧来做到这一点coalesce

select *
from t
order by coalesce(parent_ques_id, ques_id), parent_ques_id, ques_id
Run Code Online (Sandbox Code Playgroud)

排序逻辑为:

  1. 依次对所有父子关系进行排序(97、101、115)coalesce(parent_ques_id, ques_id)-为父母分配自己的ID(而不是null),以便与他的孩子进行排序
  2. 使父级出现在每个组的顶部parent_ques_id-默认情况下,空值在ASC顺序中的值之前排序(在SQL Server中)
  3. 按孩子的ID对孩子进行排序 ques_id