是否可以制作一个ORDER BY子句,以确保两个字段(均为INT类型)的以下条件,分别称为child
和parent
。
parent
引用child
,但可以为null。child
的每个值必须在有序结果集中显示在parent
之前显示。 我在第5点遇到困难。
无序数据样本:
child parent
------------
1 NULL
3 5
4 2
2 5
5 NULL
显然,ORDER BY a, b
或ORDER BY b, a
都不起作用。事实上,我越是想到它,我不确定它甚至可以完成。鉴于这些限制,明显的案例如:
child parent
------------
1 2
2 1
是不允许的,因为它违反了规则3和4(显然是5)。
那么,我正在努力实现的目标是什么,如果是这样的话?平台是SQL Server 2005。
更新:示例数据的所需排序顺序:
child parent
------------
1 NULL
5 NULL
2 5
3 5
4 2
对于在父列中定义非空值的每一行,该值已存在于子列中。
答案 0 :(得分:6)
您可以使用递归CTE查找每个节点的“深度”,并按顺序排序:
create table node (id int, parent int)
insert into node values (1, null)
insert into node values (2, 5)
insert into node values (3, 5)
insert into node values (4, 2)
insert into node values (5, null)
insert into node values (6, 4);
with node_cte (id, depth) as (
select id, 0 from node where parent is null
union all
select node.id, node_cte.depth + 1
from node join node_cte on node.parent = node_cte.id
)
select node.*
from node
join node_cte on node_cte.id=node.id
order by node_cte.depth asc
答案 1 :(得分:1)
您将无法使用'ORDER BY'子句执行此操作,因为要求5指定订单对数据层次结构敏感。在SQL Server 2005中,层次结构数据通常使用递归CTE进行处理;也许这里有人会为这种情况提供适当的代码。