Member 14024377 Ответов: 2

Я должен вернуть родителя-ребенка по приказу


id |parent_id |name
-------------------------
1  |0         |Sports
2  |0         |Clothes   
3  |0         |Facial     
4  |2         |Mens 
5  |0         |Electronics
6  |2         |Shirts
7  |3         |Cream
8  |5         |Mobile
9  |8         |Apple


Что я уже пробовал:

id |parent_id |name
-------------------------
1  |0         |Sports
2  |0         |Clothes   
4  |2         |Mens 
6  |2         |Shirts
3  |0         |Facial
7  |3         |Cream     
5  |0         |Electronics
8  |5         |Mobile
9  |8         |Apple

OriginalGriff

Мы более чем готовы помочь тем, кто застрял, но это не значит, что мы здесь, чтобы сделать все это для вас! Мы не можем сделать всю работу, вам либо платят за это, либо это часть ваших оценок, и было бы совсем несправедливо, если бы мы сделали все это за вас.

Поэтому нам нужно, чтобы вы сделали эту работу, и мы поможем вам, когда вы застрянете. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.

Member 14024377

Я попробовал ниже код.
Но только первый родитель ребенок извлекает по порядку


выбирать *
из Product_Category
заказать по
дело
когда parent_id = 0
затем имя
еще (
выбранное имя
из родительской категории Product_Category
где именно parent.id = Product_Category.parent_id
)
конец
, случай, когда parent_id = 0, ТО 1 end desc
, имя

CHill60

Обычно я не подталкиваю людей к одной из своих собственных статей, но пример "прохождение иерархии" может быть именно тем, что вам нужно - Циклы обработки в SQL Server[^]

Maciej Los

Звучит как ответ на мой вопрос ;)

CHill60

Опубликованный :-)

2 Ответов

Рейтинг:
2

Maciej Los

Прежде всего, пожалуйста, перейдите по ссылке, предоставленной компанией CHill60[^].

Попробовать это:

DECLARE @hierarchy TABLE (id INT IDENTITY(1,1), parent_id INT, name NVARCHAR(50))
INSERT INTO @hierarchy(parent_id, name)
VALUES(0, 'Sports'),
(0, 'Clothes'),
(0, 'Facial'),
(2, 'Mens'),
(0, 'Electronics'),
(2, 'Shirts'),
(3, 'Cream'),
(5, 'Mobile'),
(8, 'Apple')

;WITH CTE AS
(
        --initial query
	SELECT id, parent_id, name, 1 AS distance, id as pid
	FROM @hierarchy 
	WHERE parent_id = 0
        --recursive part
	UNION ALL
	SELECT h.id, h.parent_id, h.name, distance + 1 AS distance, h.parent_id As pid
	FROM @hierarchy h INNER JOIN CTE c ON c.id = h.parent_id 
)
SELECT *
FROM CTE 
ORDER BY pid, distance


Как вы можете видеть, я использовал небольшой трюк, чтобы вернуть данные в правильном порядке:
- в первом цикле:
     - я устанавливаю 1 в качестве расстояния
     - я получаю [удостоверение личности] от @hierarchy таблица как [pid]
- в каждом следующем цикле:
     - я вычисляю расстояние, добавляя 1
     - я получаю [parent_id] от @hierarchy таблица как [pid]


Рейтинг:
0

CHill60

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

Проработайте пример и вернитесь со своим кодом, если у вас все еще есть проблемы - Циклы обработки в SQL Server[^]


Maciej Los

Вот это да!