Каков самый простой способ выполнить рекурсивное самосоединение в SQL Server? У меня есть такая таблица:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
5 YT NULL
6 IS 5
И я хочу иметь возможность получать записи, относящиеся только к иерархии, начиная с конкретного человека. Итак, если бы я запросил иерархию CJ по PersonID = 1, я бы получил:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
А для EB я бы получил:
PersonID | Initials | ParentID
2 EB 1
4 SW 2
Я немного застрял в этом, не могу придумать, как это сделать, кроме ответа с фиксированной глубиной, основанного на кучке объединений. Так получится, потому что у нас не будет много уровней, но я хотел бы сделать это как следует.
Спасибо! Крис.
Ответы:
Добавив условие упорядочивания, вы можете сохранить порядок дерева:
Изменяя
ORDER BY
условие, вы можете изменить порядок братьев и сестер.источник
PersonID = theIdYouAreLookingFor
вместоParentID IS NULL
.WITH
предложении. Если вам нужна конкретика, создайте скрипку на sqlfiddle.com и разместите ссылку здесь.Используя CTE, вы можете сделать это так
источник
Запрос Quassnoi с изменением для большой таблицы. Родители с большим количеством потомков, чем 10: форматирование row_number () как str (5)
источник
SQL 2005 или новее, CTE - это стандартный способ работы в соответствии с показанными примерами.
SQL 2000, вы можете сделать это с помощью UDF -
(который будет работать в 2005 году, это просто не стандартный способ сделать это. Тем не менее, если вы обнаружите, что это более простой способ работы, бегите с ним)
Если вам действительно нужно сделать это в SQL7, вы можете сделать примерно то же самое в sproc, но не можете выбрать из него - SQL7 не поддерживает UDF.
источник
Проверьте следующее, чтобы понять концепцию рекурсии CTE.
источник