Get All Child SQL - PullRequest
       14

Get All Child SQL

0 голосов
/ 04 апреля 2020

У меня есть таблица типа:

oName     oPost    oPoint
A         1        NULL
B         2        1
C         3        1
D         4        1
E         5        2
F         6        2
G         7        3

Итак, если я выберу oName = A, то результат должен быть:

oName
A
B
C
D
E
F
G

Если я выберу oName = B, то результат должен быть:

oName
B
E
F

Как я могу сделать это на SQL?

1 Ответ

2 голосов
/ 04 апреля 2020

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

DECLARE @name VARCHAR(1);
SET @name = 'A';

WITH CTE AS (
  SELECT oName, oPost
  FROM data
  WHERE oName = @name
  UNION ALL
  SELECT d.oName, d.oPost
  FROM data d
  JOIN CTE ON CTE.oPost = d.oPoint
)
SELECT oName
FROM CTE
ORDER BY oName

Вывод:

oName
A
B
C
D
E
F
G

Или, если вы SET @name='B', вывести is

oName
B
E
F

Демонстрация на dbfiddle

...