FriendsKenny
@FriendsKenny

Как фильтровать дерево?

Имеется таблица:

declare @tree table
(
	id int,
	ParentID int,
	Name varchar(100)
);


Как ее можно фильтровать по Name чтобы если у найденной строки были родители по ParentID и он их всех вытаскивал?

Например:

insert @tree values
(1,null,'111'),
(2,1,'222'),
(3,1,'333'),
(4,2,'444'),
(5,2,'555'),
(6,4,'666'),
(7,4,'777');


Если ищу name like '%444%' то так же должны вытянуться строчки с id 1 и 2 т. к. они его родители(по parentID).
  • Вопрос задан
  • 2280 просмотров
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Как ее можно фильтровать по Name чтобы если у найденной строки были родители по ParentID и он их всех вытаскивал?

Если ищу name like '%444%' то так же должны вытянуться строчки с id 1 и 2 т. к. они его родители(по parentID).

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

Первый вариант, который приходит в голову, это объединение результатов:
SELECT * FROM @tree AS a WHERE a.Name LIKE '%444%'
UNION
SELECT b.* FROM @tree AS a
INNER JOIN @tree AS b ON b.id = a.ParentID
WHERE a.Name LIKE '%444%'


Обновлено:
Хотя нет, более одного родителя может быть. Неправильно понял вопрос. Тогда вот так:
;WITH hierarchy
(
	[level], id, ParentID, Name
)
AS
(
	SELECT 
	0, id, ParentID, Name
	FROM @tree AS a
	WHERE a.name LIKE '%444%'
	UNION ALL
	SELECT
	h.[level] + 1, b.id, b.ParentID, b.Name
	FROM @tree AS b
	INNER JOIN hierarchy AS h ON h.ParentID = b.id
)

SELECT * FROM hierarchy;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы