Сложные TSQL заказывают пунктом

Действительно ли возможно создать пункт ORDER BY для обеспечения следующих критериев двух полей (оба из типа INT), названный child и parent соответственно для этого примера.

  1. parent ссылки child, но может быть пустым.
  2. Родитель может иметь несколько детей; ребенок только один родитель.
  3. Ребенок не может быть родителем себя.
  4. Там должен существовать по крайней мере один ребенок без родителя.
  5. Каждое значение 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

Для каждой строки, которая определяет ненулевое значение в родительском столбце, значение уже было существующим интервалом нижестоящий столбец.

7
задан Quick Joe Smith 5 July 2010 в 12:16
поделиться

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
6
ответ дан 7 December 2019 в 07:40
поделиться

Вы не сможете сделать это с предложением 'ORDER BY', поскольку требование 5 определяет, что порядок чувствителен к иерархии данных. В SQL Server 2005 иерархические данные обычно обрабатываются с помощью рекурсивных CТЕ; может быть, кто-то здесь предоставит соответствующий код для этого случая.

1
ответ дан 7 December 2019 в 07:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: