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

Откуда:
Сообщений: 1062
WITH DirectReports ([ParentId],[Id],[Level])AS
(
SELECT [ParentId],[Id], 0 as [Level]
FROM [dbo].[продукты]
WHERE [ParentId] IS NULL
UNION ALL
SELECT e.[ParentId],e.[Id],e.[Level]+1
FROM [dbo].[продукты] AS e
INNER JOIN DirectReports AS d
ON e.[ParentId] = d.[Id]
)
SELECT [ParentId],[Id],[Level]
FROM DirectReports as [x] where [x].[Id]=734782736746 ---- это продукт самого нижнего уровня
этот запрос вернул

яблоки голден - яблоки
GO

select * from [dbo].[продукты] as [x]
left join [dbo].[продукты] as [xx] on [xx].[Id]=[x].[ParentId]
left join [dbo].[продукты] as [xxx] on [xxx].[Id]=[xx].[ParentId]
where [x].[Id]=734782736746 ---- это продукт самого нижнего уровня

этот запрос вернул

яблоки голден - яблоки- фрукты
24 сен 14, 11:14    [16614555]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
этот запрос вернул

яблоки голден - яблоки- фрукты

И что он сделал неправильно ?
24 сен 14, 11:15    [16614566]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Glory,
первый запрос должен был вернуть все уровни иерархии сколько бы их не было (в данном случае 3 а он вернул 1)
яблоки голден - яблоки

а должен был вернуть

яблоки голден - яблоки- фрукты
24 сен 14, 11:19    [16614590]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
первый запрос должен был вернуть все уровни иерархии сколько бы их не было (в данном случае 3 а он вернул 1)
яблоки голден - яблоки

Почему должен все, если вы указали where [x].[Id]=734782736746 ?
24 сен 14, 11:21    [16614606]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Glory,

в этом запросе я тоже указал продукт (where [x].[Id]=734782736746)

select * from [dbo].[продукты] as [x]
left join [dbo].[продукты] as [xx] on [xx].[Id]=[x].[ParentId]
left join [dbo].[продукты] as [xxx] on [xxx].[Id]=[xx].[ParentId]
where [x].[Id]=734782736746 ---- это продукт самого нижнего уровня

но этот же запрос вернул все уровни иерархии

Я хочу видеть для каждого продукта все его иерархию

например

булочка с кремом- сдоба-хлебное изделие -хлеб ид
24 сен 14, 11:26    [16614642]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
но этот же запрос вернул все уровни иерархии

Это - не "этот же запрос". Это - другой запрос

кириллk
Я хочу видеть для каждого продукта все его иерархию

Ну так тогда и надо писать рекурсивный запрос от детей к родителям, а не наоборот.
24 сен 14, 11:28    [16614654]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Glory,

когда меняю ON e.[ParentId] = d.[Id] на ON e.[Id] = d.[ParentId] он вообще не работает . но даже если не менять последовательность, почему

WITH DirectReports ([ParentId],[Id],[Level])AS

не вовзращает

хлеб - хлебное изделие - сдоба - булочка с кремом?
24 сен 14, 11:34    [16614694]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
когда меняю ON e.[ParentId] = d.[Id] на ON e.[Id] = d.[ParentId] он вообще не работает . но даже если не менять последовательность, почему

Потому, что вы пишите ерунду.
Начать иерерархию с ребенка - это не поменять условие в ON
24 сен 14, 11:36    [16614708]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
кириллk,

начните, наконец, пользоваться тегом SRC!

По теме: Вам надо переписать условие базового запроса рекурсии.
24 сен 14, 11:41    [16614739]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
WITH DirectReports ([ParentId],[Id],[Level])AS 
(
 SELECT [ParentId],[Id], 0 as [Level]
 FROM [dbo].[продукты] 
WHERE [ParentId] IS NULL 
 UNION ALL
 SELECT e.[ParentId],e.[Id],e.[Level]+1
 FROM [dbo].[продукты] AS e
 INNER JOIN DirectReports AS d
 ON e.[ParentId] = d.[Id] 
)
SELECT [ParentId],[Id],[Level]
FROM DirectReports as [x] where [x].[Id]=734782736746


А можете дать пример в мсдн как поменять порядок иерархии?
24 сен 14, 11:45    [16614769]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
кириллk,

В идеале, я бы хотел построить 2 иерархии

континент-страна-регион-город
и
город-регион-страна-континент

через WITH
24 сен 14, 11:49    [16614797]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
А можете дать пример в мсдн как поменять порядок иерархии?

Мда

WITH DirectReports ([ParentId],[Id],[Level])AS 
(
 SELECT [ParentId],[Id], 0 as [Level]
 FROM [dbo].[продукты] 
WHERE [Id]=734782736746
 UNION ALL
 SELECT e.[ParentId],e.[Id],e.[Level]+1
 FROM [dbo].[продукты] AS e
 INNER JOIN DirectReports AS d  ON e.[Id] = d.[ParentId]
)
SELECT [ParentId],[Id],[Level]
FROM DirectReports 
24 сен 14, 11:50    [16614809]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Glory,

Сделал пример

declare @t table (
[id] [bigint],
[Parentid] [bigint],
[Name] [nvarchar](50)
)

insert into @t

select 1 as [Id], Null [Parentid] , 'Евразия'[Name] union all
select 2 as [Id], 1 [Parentid] , 'Россия'[Name] union all
select 3 as [Id], 2 [Parentid] , 'Урал'[Name] union all
select 4 as [Id], 3 [Parentid] , 'Мариуполь'[Name] 
select * from @t;


WITH DirectReports AS 
(
select [ParentId],[id],[name] from @t where [ParentId] is null
union all
select [x].[ParentId],[x].[id],[x].[name] from @t as [x]
inner join DirectReports as [xx] on [xx].[ParentId]=[x].[Id]
)
SELECT *
FROM DirectReports as [x] 


как сделать


--Евразия - Россия - Урал -Мариуполь
--Мариуполь- Урал - Россия--Евразия
24 сен 14, 12:04    [16614907]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
кириллk
[xx].[ParentId]=[x].[Id]


поменять алиасы местами
24 сен 14, 12:10    [16614931]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Glory
Member

Откуда:
Сообщений: 104751
declare @t table (
[id] [bigint],
[Parentid] [bigint],
[Name] [nvarchar](50)
)

insert into @t

select 1 as [Id], Null [Parentid] , N'Евразия'[Name] union all
select 2 as [Id], 1 [Parentid] , N'Россия'[Name] union all
select 3 as [Id], 2 [Parentid] , N'Урал'[Name] union all
select 4 as [Id], 3 [Parentid] , N'Мариуполь'[Name] 
select * from @t;


WITH DirectReports AS 
(
select [ParentId],[id],[name] from @t where [ParentId] is null
union all
select [x].[ParentId],[x].[id],[x].[name] from @t as [x]
inner join DirectReports as [xx] on [xx].[Id]=[x].[ParentId]
)
SELECT *
FROM DirectReports as [x] 

;WITH DirectReports AS 
(
select [ParentId],[id],[name] from @t where [Id] = 4
union all
select [x].[ParentId],[x].[id],[x].[name] from @t as [x]
inner join DirectReports as [xx] on [xx].[ParentId]=[x].[Id]
)
SELECT *
FROM DirectReports as [x] 
24 сен 14, 12:31    [16615105]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Glory,

Простите, а где здесь цикл?

Просто кто-то писал, чтобы сделать иерархию когда не знаешь сколько уровней, надо делать цикл
24 сен 14, 12:48    [16615286]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
Простите, а где здесь цикл?

Унутри.

кириллk
Просто кто-то писал, чтобы сделать иерархию когда не знаешь сколько уровней, надо делать цикл

Если хотите, то пишите через цикл
24 сен 14, 12:50    [16615308]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2428
кириллk
Простите, а где здесь цикл?


http://msdn.microsoft.com/ru-ru/library/ms175972.aspx
24 сен 14, 13:02    [16615413]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
StarikNavy,

Увы у меня не поулчилось.

Мне надо чтобы возвращал

--Евразия - Россия - Урал -Мариуполь

А он возвращает

ParentId id name
NULL 1 Евразия
1 2 Россия
2 3 Урал
3 4 Мариуполь
24 сен 14, 13:31    [16615656]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Glory
Member

Откуда:
Сообщений: 104751
Задача "суммирования" текстовых полей не имеет отношения к "иерархии с неизвестным уровнем вложенности"
24 сен 14, 13:33    [16615664]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
кириллk,

а когда я переношу на свою таблицу, он возвращает

2 уровня

или
--Евразия - Россия

или
- Урал -Мариуполь
24 сен 14, 13:33    [16615669]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
кириллk,

Вообще задача я думал тривиальная

Сделать из противной древовидной таблицы, простую реляционную.

А по факту везде вылазят эти уровни.

Неужели нельзя было сделать несколько таблиц а не пихать все в одну? :(
24 сен 14, 13:39    [16615714]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
Glory
Member

Откуда:
Сообщений: 104751
кириллk
Вообще задача я думал тривиальная

Настолько тривиальная, что даже в FAQ уже несколько лет есть

кириллk
Сделать из противной древовидной таблицы, простую реляционную.

Вот только не надо бросаться терминами, которые не имеют отношения к вашей задаче

кириллk
А по факту везде вылазят эти уровни.

Уровень вашего непонимания рекурсии.
24 сен 14, 13:41    [16615736]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
кириллk
Member

Откуда:
Сообщений: 1062
кириллk
Сделать из противной древовидной таблицы, простую реляционную.

Вот только не надо бросаться терминами, которые не имеют отношения к вашей задаче


Так мне и надо, из дурацкого дерева, сделать простую табличку :)

Я даже думаю , что мне не нужна рекурсия мне надо

select * from [dbo].[продукты] as [x]
left join [dbo].[продукты] as [xx] on [xx].[Id]=[x].[ParentId]
left join [dbo].[продукты] as [xxx] on [xxx].[Id]=[xx].[ParentId]
 where [x].[Id]=734782736746 ---- это продукт самого нижнего уровня


Только проблема в том, что я не знаю сколько надо раз таблицу саму на себя заджойнить
Ибо не знаю количества уровней вложения
24 сен 14, 14:19    [16615984]     Ответить | Цитировать Сообщить модератору
 Re: иерархия с неизвестным уровнем вложенности  [new]
o-o
Guest
кириллk,

о да, вот тогда точно будет жутко реляционный результат с не бог весть скОлькими столбцами,
в 3-ей НЕнормальной форме.

и Мариуполь на Украину верните, Урал и без него опорный край державы
24 сен 14, 14:28    [16616033]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить