Рекурсивный вопрос SQL - PullRequest
       15

Рекурсивный вопрос SQL

1 голос
/ 12 февраля 2011

Мне нужно найти все категории на текущем уровне или ниже, в которых есть предметы или есть подкатегории с предметами.Категории имеют CategoryID, ParentCategoryID.У предметов есть CategoryID.

У меня большая часть решения с использованием хранимой процедуры:

AS   
WITH get_cat_hier   
AS  
(  

Select e.CategoryID, e.ParentCategoryID, From Categories AS e  
    where e.ParentCategoryId = @ParentCategoryId   
    union ALL  
    Select e.CategoryID, e.ParentCategoryID, From Categories e  
    inner join get_cat_hier AS ecte on ecte.CategoryID = e.ParentCategoryID  
        )  

select DISTINCT e.CategoryID from Categories as e   
 inner join items as item on (item.CategoryID = e.CategoryID) -- *******Problem*****  
where   
  (e.CategoryID in (select CategoryID FROM get_cat_hier AS CategoryID)

)  

К сожалению, это возвращает только категории с элементами, а не категории с подкатегориями с элементами,Мне нужно как-то заменить "item.CategoryID = e.CategoryID" рекурсивным вызовом.

Ответы [ 3 ]

2 голосов
/ 12 февраля 2011

Я не уверен, что это новое решение или оно находится в разработке. Создание отчетов такого типа намного проще, если вы используете вложенные наборы для представления иерархий. У Джо Селко есть несколько замечательных статей на эту тему.

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

Вы должны рассмотреть возможность использования вложенных множеств и не использовать систему родительских указателей.

http://en.wikipedia.org/wiki/Nested_set_model

0 голосов
/ 12 февраля 2011

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

Его предложение WHERE на самом деле должно быть where e.CategoryId = @ParentCategoryId.

0 голосов
/ 12 февраля 2011
  1. Уберите предложение "где" (я не думаю, что это необходимо)
  2. Оставьте соединение вашего предмета, а затем также присоединитесь к get_cat_heir между таблицей предметов и таблицей категорий.
...