SQL-запрос для цепочки родитель-потомок - PullRequest
4 голосов
/ 15 ноября 2010

У меня есть одна таблица, которая может ссылаться на одного другого члена таблицы как на родителя.Этот родитель также может ссылаться на еще одну строку в качестве своего родителя ... и т. Д.

id     col1     col2    parentID
1      foo      bar       NULL
2      blah     boo       1
3      fob      far       2
4      wob      lob       NULL

Я хотел бы вернуть цепочку с указанным идентификатором.Поэтому, если бы id был 3, я бы возвратил строку 3, строку 2 и строку 1. Если бы id был 2, я бы возвратил строку 2 и строку 1. Если бы идентификатор был 1 или 4, я бы просто возвратил эту строку.* спасибо

Ответы [ 4 ]

11 голосов
/ 15 ноября 2010

Использовать рекурсивный CTE :

DECLARE @id INT
    SET @id = 3

;WITH hierarchy AS (
  SELECT t.id, t.parentid
    FROM YOUR_TABLE t
   WHERE t.id = @id
 UNION ALL
 SELECT x.id, x.parentid
   FROM YOUR_TABLE x
   JOIN hierarchy h ON h.parentid = x.id)
SELECT h.id
  FROM hierarchy h

Результаты:

id
---
3
2
1
1 голос
/ 20 декабря 2010

Если вы используете рекурсивный CTE, не забудьте добавить

h.parentid <> x.id

при вашем присоединении

JOIN hierarchy h ON h.parentid = x.id)

иначе вы будете просто Максимальная ошибка рекурсии , так как она зацикливается

1 голос
/ 15 ноября 2010

Вот, пожалуйста,

SELECT P.cat_id AS parent_cat_id, P.parent_id AS ROOT, P.cat_name AS parent_cat_name, C.parent_id, C.cat_id, C.cat_name FROM categories AS P LEFT OUTER JOIN categories AS C ON C.parent_id=P.cat_id WHERE P.parent_id IS NULL ORDER BY parent_cat_name, cat_name
0 голосов
/ 03 июня 2017
WITH Hierarchy(ChildId, ChildName, Generation, ParentId)
AS
(
    SELECT Id, Name, 0, ParentId
        FROM UserType AS FirtGeneration
        WHERE ParentId IS NULL        
    UNION ALL
    SELECT NextGeneration.Id, NextGeneration.Name, Parent.Generation + 1, Parent.ChildId

        FROM UserType AS NextGeneration
        INNER JOIN Hierarchy AS Parent ON NextGeneration.ParentId = Parent.ChildId    
)
SELECT *
    FROM Hierarchy
    OPTION(MAXRECURSION 32767)
...