2016-06-29 7 views
-1

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

SELECT [pkID] 
    ,[parentID] 
    ,[CategoryName] 
FROM [tblCategory] 
WHERE [pkID] = 6 
UNION ALL 
SELECT [Sub].[pkID] 
    ,[Sub].[ParentID] 
    ,[Sub].[CategoryName] 
FROM [tblCategory] [Sub] 
INNER JOIN [tblCategory] AS [Sub2] ON [Sub].[ParentID] = [Sub2].[pkID] 

Я получаю другие дочерние узлы при выполнении этого запроса Примечание * В приложении VB.Net (где этот SQL должен быть вызван) ParentID из 0 является корневым узлом в древовидной структуре.

Таблица

pkID | ParentID | CategoryName 
1 | 6  | Category1 
2 | 0  | Category2 
3 | 0  | Category3 
4 | 0  | Category4 
5 | 0  | Category5 
6 | 0  | Category6 
7 | 0  | Category7 
8 | 0  | Category8 
9 | 7  | Category9 

Результаты

pkID | parentID | CategoryName 
6 | 0  | Category6 
1 | 6  | Category1 
9 | 7  | Category9 <-- not a child of pkID=6 
+3

Это текущий результат или желаемый результат? (укажите оба) – jarlh

+0

Является ли это рекурсивным CTE? потому что выглядит так, как будто вы пропустите CTE –

+0

С помощью вашего редактирования вам потребуется рекурсивный cte и привязать его соответствующим образом, я изменюсь. – Matt

ответ

3

Это потому, что вам нужно то же самое, когда оператор на нижней подберет tblcategoryWHERE [pkID] = 6. Из-за этого вы получаете детей всего стола.

Так что-то подобное должны работать:

SELECT [pkID] 
    ,[parentID] 
    ,[CategoryName] 
FROM [tblCategory] 
WHERE [pkID] = 6 
UNION ALL 
SELECT [Sub].[pkID] 
    ,[Sub].[ParentID] 
    ,[Sub].[CategoryName] 
FROM [tblCategory] [Sub] 
INNER JOIN [tblCategory] AS [Sub2] ON [Sub].[ParentID] = [Sub2].[pkID] 
WHERE [sub].[pkID] = 6 

упрощена Хуан отметил, и я должен был думать о том, может быть сделана как одно условие, где на тот же оператор выбора.

SELECT [pkID] 
    ,[parentID] 
    ,[CategoryName] 
FROM [tblCategory] 
WHERE [pkID] = 6 
    or ParentId = 6 

Вот рекурсивный метод КТР, чтобы все дети, внукам, правнуки детей и т.д. из ParentID.

;WITH cte AS (
    SELECT [pkID] 
     ,[parentID] 
     ,[CategoryName] 
     -- ,1 AS [Level] 
    FROM [tblCategory] 
    WHERE [pkID] = 6 


    UNION ALL 

    SELECT 
     t.pkId 
     ,t.[parentID] 
     ,t.CategoryName 
     -- ,[Level] + 1 AS [Level] 
    FROM 
     [tblCategory] t 
     INNER JOIN cte c 
     ON t.ParentId = c.pkId 
) 

SELECT * 
FROM cte 
+0

Я пытался использовать Уровень раньше, но он говорит, что это недопустимое имя столбца в ssms – Alex

+0

, какая версия sql-сервера вы используете? В любом случае, если вы измените псевдоним столбца на что-то еще или просто скопируйте его, он будет работать для вас. – Matt

1

Похоже, вы пытаетесь сделать рекурсивный cte, но тогда вы передумаете.

Этот запрос можно упростить как

SELECT [pkID] 
    ,[parentID] 
    ,[CategoryName] 
FROM [tblCategory] 
WHERE [pkID] = 6 
    OR [ParentID] = 6 
+0

yep Я должен был взглянуть на это немного больше indepth, чтобы исправить правильно, а не просто внести незначительные изменения в его заявление, которое, как я знал, будет работать. Хороший догоняющий голос вам. – Matt

+0

Да, я видел недостающий CTE, но не был уверен, что OP хочет. –

1

предположив, что второй узел может иметь Чайлдс, а я хотел бы предложить рекурсивный запрос. Что-то вроде этого (непроверено):

DECLARE @SearchID int = 6; 

WITH cteTree AS(
SELECT pkID, parentID, CategoryName 
    FROM tblCategory 
    WHERE pkID = @SearchID 
UNION ALL 
SELECT pt.pkID, pt.parentID, pt.CategoryName 
    FROM tblCategory AS pt 
    JOIN cteTree AS ct ON ct.pkID = pt.parentID 
) 
SELECT * 
    FROM cteTree 
+0

рекурсивный цит уже был частью моего ответа за 10 минут до того, как вы опубликовали это, я что-то пропустил? – Matt

+0

Извините! Это не было показано, когда я споткнулся о вопросе. Затем я набрал свой ответ, должен был исправить форматирование и так далее, и когда я передал свой ответ, ваш был отображен ... думаю, я был слишком медленным. Опять же: извините! Не собирался повторять ответ с уже предоставленной идеей. – Tyron78

+0

Не стоит беспокоиться о том, как великие мысли думают одинаково. Это безумие, как быстро некоторые ответы публикуются здесь. – Matt

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