2013-11-25 15 views
1

Мне нужен запрос, который выбирает мне все дочерние категории с заданным родительским идентификатором. Моя таблица выглядит следующим образом:Получить иерархические категории родительской категории

|ID | Title | Description | ParentId 
-------------------------------------- 
1 | Games | ...   | NULL 

и так далее ..

Можно ли решить эту проблему с помощью SQL-запроса?

Дайте мне все дочерние категории категории игр ..

Всех дочерних категорий может иметь несколько дочерних категории и так далее ..

Мне это нужно для моего меню сайта в список продуктов ..
Моя попытка Использование CocoDb Go

;WITH parent 
    AS (SELECT ParentId 
     FROM [CocoDb].[dbo].[Categories] 
     WHERE Id = 11) 
,tree AS (SELECT x.ParentId, x.Id 
      FROM [CocoDb].[dbo].[Categories] x 
       INNER JOIN [CocoDb].[dbo].[Categories] ON x.Id = 11 
      UNION ALL 
      SELECT y.Id, y.ParentId FROM [CocoDb].[dbo].[Categories] y 
      INNER JOIN [CocoDb].[dbo].[Categories] t ON y.Id = t.ParentId) 

Решение:

;WITH parent 
    AS (SELECT ParentId, Title, Id 
     FROM [CocoDb].[dbo].[Categories] 
     WHERE Id = 1 
    ) 
,tree AS ( 
      SELECT x.ParentId, x.Id, x.Title 
      FROM [CocoDb].[dbo].[Categories] x 
       INNER JOIN parent ON x.ParentId = parent.Id 
      UNION ALL 
      SELECT y.ParentId, y.Id, y.Title 
      FROM [CocoDb].[dbo].[Categories] y 
      INNER JOIN tree t ON y.ParentId = t.Id 
     ) 
SELECT * 
FROM Tree 
+0

Посмотрите на рекурсию: http://msdn.microsoft.com/en-us/library/ms175972.aspx –

ответ

0
SELECT C.* 
FROM <TABLE> C INNER JOIN <TABLE> P 
ON P.ID=C.PARENTID 
WHERE PARENTID=<GIVEN PARENTID> 
1
;WITH parent AS 
    (
    SELECT Parent 
    FROM Table1 
    WHERE Child = @p0 
    )  
,tree AS 
    (
    SELECT x.Parent, x.Child 
    FROM Table1 x 
    INNER JOIN parent ON x.Parent = parent.Parent 
    UNION ALL 
    SELECT y.Parent, y.Child 
    FROM Table1 y 
    INNER JOIN tree t ON y.Parent = t.Child 
    ) 
     SELECT Parent, Child 
     FROM tree 

Обновление для запроса

;WITH parent 
    AS (SELECT ParentId 
     FROM [CocoDb].[dbo].[Categories] 
     WHERE Id = 11 
    ) 
,tree AS ( 
      SELECT x.ParentId, x.Id 
      FROM [CocoDb].[dbo].[Categories] x 
       INNER JOIN parent ON x.ParentId = parent.ParentId 
      UNION ALL 
      SELECT y.ParentId, y.Id 
      FROM [CocoDb].[dbo].[Categories] y 
      INNER JOIN tree t ON y.ParentId = t.Id 
     ) 
SELECT parent, Child 
FROM Tree 

Убедитесь, что вы используете ; перед тем WITH как я использовал в вышеуказанных запросов.

+0

. Знак commar at, tree AS не работает :-( – Patrik

+0

@Patrik test здесь работает для этих данных http://sqlfiddle.com/#!3/3cb21/1, Предполагая, что вы ищете дерево childer для родителя, где ID = 2 –

+0

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

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