2013-08-15 4 views
0

мне нужна помощь с запросом SQL, я попытался повторить мою актуальную проблему, создав этот простой пример:SQL запросов: необходимую помощь

Родители стол:

id name  parent_id 
1 parent1  null 
2 parent2  1 
3 parent3  1 
4 parent4  3 
5 parent5  3 
6 parent6  5 
7 parent7  5 

Родственникам стол:

id name  parent_id 
1 relative1 2 
2 relative2 3 
3 relative3 4 
4 relative4 5 
5 relative5 7 

В таблице родителей есть список родителей, у которых также есть родители. В таблице «Родственники» есть список родственников с столбцом parent_id.

Как бы мне найти все родственник parent3 включая все «desendants» в parent3, т.е. запрос должен возвращать следующий из родичей таблицы:

relative2 (так как родительский идентификатор 3)

relative3 (так как родительский идентификатор 4, родитель идентификатор 3)

relative4 (так как родительский идентификатор 5, родитель идентификатор 3)

relative5 (так как родительский идентификатор 7 которого родитель идентификатор 5 чей родитель i d is 3)

Я использую SQL Server 2008. Надеюсь, что имеет смысл, любая помощь приветствуется.

+3

Это общий случай рекурсии. Вы должны найти много похожих примеров в google. Советы: узнайте больше о рекурсии и CTE, и вы сможете сбить ее с ног. Если у вас все еще есть проблемы, создайте sqlfiddle и разместите свой вопрос здесь. –

ответ

0

Попробуйте

;WITH CTE 
AS 
(
    SELECT [id], [name] FROM Parents WHERE [name] = 'parent3' 
    UNION ALL 
    SELECT T1.[id], T1.[name] FROM CTE c 
    INNER JOIN Parents T1 ON c.[id] = T1.[parent_id] 
) 

SELECT * FROM Relatives 
WHERE [parent_id] IN (SELECT [id] FROM CTE) 

SQL FIDDLE DEMO

+0

Прекрасный пример, теперь я просто пытаюсь это понять, это правильно: Первый выбор дает id = 3 и name = parent3 из Parents. Второй оператор select получает идентификатор и имя от родителя, где parent_id = 3, который дает мне идентификатор и имя строки 4 и 5. Это часть, где я немного не уверен, что будет дальше; второй набор результатов «заменит» первый, а затем второй выбор снова запускает поиск от родителей, где id равен 4 или 5. Затем второй выбор снова запускается с использованием идентификатора из каждого последующего набора результатов. Он продолжается до тех пор, пока выбор не вернет никаких значений. – gttommo

Смежные вопросы