Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 рекурсия  [new]
iguess
Guest
Добрый день!

есть таблица с каталогом товаров. в ней есть поля ItemId, ParentItemId, ItemName, ProducerId, IsFolder, IsVisible и еще много других полей.
в таблице хранятся как группы так и сами товары. простая иерархия основанная на полях ItemId и ParentItemId. уровни вложенности могут быть различные для разных групп товаров.

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

сейчас делаю вот так:
select ItemId, ParentItemId, ItemName
from goods
where ParentItemId = @ParentItemId and ((IsFolder = 1 and IsVisible = 0) or (IsFolder = 0 and IsVisible = 1 and ProducerId in (71,238,44)))	

(у папок(т.е. групп) IsVisible всегда 0)

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

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

скорее всего нужно делать через CTE, но как-то не получается правильно (

помогите плиз.
9 ноя 11, 08:55    [11567294]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
iguess,

как то так
; with ste as(
select g.ItemId, g.ParentItemId, g.ItemName, 1 as lvl from goods g
union all
select g.ItemId, g.ParentItemId, g.ItemName, lvl + 1 as lvl from ste st
join goods g on g.ParentItemId = st.ItemID
)
select * from ste
9 ноя 11, 09:42    [11567427]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
gds
iguess,

как то так
; with ste as(
select g.ItemId, g.ParentItemId, g.ItemName, 1 as lvl from goods g
union all
select g.ItemId, g.ParentItemId, g.ItemName, lvl + 1 as lvl from ste st
join goods g on g.ParentItemId = st.ItemID
)
select * from ste

Условие забыл наложить
select g.ItemId, g.ParentItemId, g.ItemName, 1 as lvl from goods g where g.ParentItemId is null
ну, или любое другое условие.
9 ноя 11, 09:44    [11567440]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
iguess
Guest
спасибо, но Ваш запрос выдает все группы и товары.
хотелось бы чтобы условия выполнялись

пробую следующее:

with ste as(
select g.ItemId, g.ParentItemId, g.ItemName, g.ProducerId, 1 as lvl from goods g where g.ParentItemId is null and g.SellerId = 3
union all
select g.ItemId, g.ParentItemId, g.ItemName, g.ProducerId, lvl + 1 as lvl from ste st
join goods g on g.ParentItemId = st.ItemID
where (g.IsFolder = 1 and g.IsVisible = 0) or (g.IsFolder = 0 and g.IsVisible = 1 and g.ProducerId in (71,238,44))
)
select * from ste

этот запрос выдает все группы, но товары соответствующие условию.
нужно теперь, чтобы группы, в которых нет нужных товаров тоже не отображались
9 ноя 11, 12:10    [11568339]     Ответить | Цитировать Сообщить модератору
 Re: рекурсия  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
iguess
спасибо, но Ваш запрос выдает все группы и товары.
хотелось бы чтобы условия выполнялись

пробую следующее:

with ste as(
select g.ItemId, g.ParentItemId, g.ItemName, g.ProducerId, 1 as lvl from goods g where g.ParentItemId is null and g.SellerId = 3
union all
select g.ItemId, g.ParentItemId, g.ItemName, g.ProducerId, lvl + 1 as lvl from ste st
join goods g on g.ParentItemId = st.ItemID
where (g.IsFolder = 1 and g.IsVisible = 0) or (g.IsFolder = 0 and g.IsVisible = 1 and g.ProducerId in (71,238,44))
)
select * from ste

этот запрос выдает все группы, но товары соответствующие условию.
нужно теперь, чтобы группы, в которых нет нужных товаров тоже не отображались

Включите условия отбора в этот запрос
select g.ItemId, g.ParentItemId, g.ItemName, g.ProducerId, 1 as lvl from goods g where g.ParentItemId is null and g.SellerId = 3
или выложите код создания таблицы и заполнения тестовыми данными, а также что надо получить.
9 ноя 11, 12:20    [11568425]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить