复杂的TSQL order by子句

时间:2010-07-05 11:13:08

标签: sql sql-server-2005 tsql

是否可以制作一个ORDER BY子句,以确保两个字段(均为INT类型)的以下条件,分别称为childparent

  1. parent引用child,但可以为null。
  2. 父母可以有多个孩子;一个孩子只有一个父母。
  3. 孩子不能成为自己的父母。
  4. 必须至少有一个没有父母的孩子。
  5. child的每个值必须在有序结果集中显示在parent之前显示。
  6. 我在第5点遇到困难。

    无序数据样本:

    child parent
    ------------
    1     NULL
    3     5
    4     2
    2     5
    5     NULL
    

    显然,ORDER BY a, bORDER 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
    

    对于在父列中定义非空值的每一行,该值已存在于子列中。

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进行处理;也许这里有人会为这种情况提供适当的代码。