Сложный TSQL порядок по пунктам - PullRequest
7 голосов
/ 05 июля 2010

Можно ли создать предложение 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

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

Ответы [ 2 ]

6 голосов
/ 05 июля 2010

Вы можете использовать рекурсивный CTE, чтобы найти «глубину» каждого узла и упорядочить по ней:

1 голос
/ 05 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...