SQL Server自定义排序实现:关联行紧跟对应主行的排序需求
实现指定的关联行排序需求
首先明确你的核心需求:先按Table_id排序,但如果某行的IDTable等于另一行的Table_id,该行需要紧跟在对应的主行之后。我们可以通过构造自定义排序规则来轻松实现这个效果。
原始表结构与数据
| Table_id | Name | Mark | IDTable |
|---|---|---|---|
| 1 | John | 12 | NULL |
| 2 | Alex | 15 | NULL |
| 3 | Josh | 11 | NULL |
| 4 | Merry | 17 | 2 |
| 5 | Gary | 13 | NULL |
| 6 | Jimmy | 18 | 1 |
期望排序结果
| Table_id | Name | Mark | IDTable |
|---|---|---|---|
| 1 | John | 12 | NULL |
| 6 | Jimmy | 18 | 1 |
| 2 | Alex | 15 | NULL |
| 4 | Merry | 17 | 2 |
| 3 | Josh | 11 | NULL |
| 5 | Gary | 13 | NULL |
解决方案SQL语句
SELECT Table_id, Name, Mark, IDTable FROM your_table ORDER BY -- 让子行与对应的主行归为同一排序组 COALESCE(IDTable, Table_id), -- 确保主行(IDTable为NULL)排在子行前面 CASE WHEN IDTable IS NULL THEN 1 ELSE 2 END, -- 组内及剩余无关联行按Table_id保持原始顺序 Table_id;
逻辑解释
COALESCE(IDTable, Table_id):这个函数会优先取IDTable的值,如果是主行(IDTable为NULL)就用自身的Table_id。这样子行(比如Table_id=6,IDTable=1)会和主行Table_id=1使用同一个排序键,自然被分到同一组。CASE WHEN IDTable IS NULL THEN 1 ELSE 2 END:在同一组内,给主行设置更高的排序优先级(值越小越靠前),保证主行先出现,子行紧跟其后。Table_id:最后按Table_id排序,确保没有子行的主行按原始顺序排列,同时也让子行的顺序符合预期。
执行这段SQL就能得到你想要的排序结果啦。
内容的提问来源于stack exchange,提问作者Behnam8
相关产品推荐
相关产品推荐

