Sql 按父级和子级查询订单
我正在开发一个查询,我想通过父对象和子对象进行排序,但我遇到了一个问题。他点的菜不对 这是我的问题Sql 按父级和子级查询订单,sql,sql-server,Sql,Sql Server,我正在开发一个查询,我想通过父对象和子对象进行排序,但我遇到了一个问题。他点的菜不对 这是我的问题 WITH CLASSIFICATION_LIST AS ( SELECT SUBPARENT.[ID], SUBPARENT.[NAME], SUBPARENT.[PARENTID], 1 AS LEVELCLASSIFICATION, SUBPARENT.[ID] AS HIERARCHY, SUBPARENT.[ISACTIVE]
WITH CLASSIFICATION_LIST AS
(
SELECT SUBPARENT.[ID], SUBPARENT.[NAME], SUBPARENT.[PARENTID],
1 AS LEVELCLASSIFICATION, SUBPARENT.[ID] AS HIERARCHY,
SUBPARENT.[ISACTIVE]
FROM {Classification} AS SUBPARENT
WHERE SUBPARENT.[PARENTID] IS NULL
AND (@ShowAll = 1 OR SUBPARENT.ISACTIVE = 1)
UNION ALL
SELECT CHILD.[ID], CHILD.[NAME], CHILD.[PARENTID],
EL.LEVELCLASSIFICATION+1 , EL.HIERARCHY, CHILD.[ISACTIVE]
FROM {Classification} AS CHILD
INNER JOIN CLASSIFICATION_LIST AS EL ON CHILD.[PARENTID] = EL.[ID]
WHERE CHILD.[PARENTID] IS NOT NULL
AND (@ShowAll = 1 OR CHILD.ISACTIVE = 1)
)
SELECT *
FROM CLASSIFICATION_LIST
ORDER BY 5,4,1
以下是查询输出:
正确的输出是:
Teste
Filho 1
Filho 2
Computador
Motherboard
Grafica
Memoria
Memoria
我做错了什么?请注意,您是按5,4,1排序的,即在您的案例层次结构中,按级别排序,然后按分类Id排序。 如果你敏锐地注意到,你会在标记的记录中看到,排序是因为级别不同
因此,如果您希望它们以不同的方式排序(可能仅按分类Id排序),则应使用
按1排序
,而不是按列序号排序,应按列名称排序,由于更改列顺序更容易阅读,也不容易中断,因此请在ORDERBY子句中使用名称,而不是ORDENIAL位置。在ORDER BY子句中使用序号位置被认为是不好的做法,并且会降低可读性。如果您能为我们提供一个示例数据集,那么解决问题就更容易了。我的直觉是你需要一起删除你的订单,递归CTE应该处理它。同意@Abris-请。或者更好的orderbyclassificationid