Действительно ли возможно создать пункт ORDER BY для обеспечения следующих критериев двух полей (оба из типа INT), названный child
и parent
соответственно для этого примера.
parent
ссылки child
, но может быть пустым.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
Для каждой строки, которая определяет ненулевое значение в родительском столбце, значение уже было существующим интервалом нижестоящий столбец.
Можно использовать рекурсивный 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
Вы не сможете сделать это с предложением 'ORDER BY', поскольку требование 5 определяет, что порядок чувствителен к иерархии данных. В SQL Server 2005 иерархические данные обычно обрабатываются с помощью рекурсивных CТЕ; может быть, кто-то здесь предоставит соответствующий код для этого случая.