powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Миграция ирархического запроса
19 сообщений из 19, страница 1 из 1
Миграция ирархического запроса
    #39289094
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внутри SQL запроса используется sub query для составления пути SYS_CONNECT_BY_PATH(Oracle) Для MS SQL сервера надо написать аналогичную конструкцию. Хотел использовать WITH, но он же не может выступать как sub query? Или опять попробовать использовать FOR XML PATH?
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289121
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
cte можно засунуть в табличную функцию и потом ее apply-ить
---
совет хотите?
не пытайтесь дословно перевести оракловый код.
лучше заново ставить себе задачу: вот то на входе, вот это хочу на выходе.
и решать эту задачу на T-SQL.
а то получите говнокод с такой же говнопроизводительностью
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289129
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikIХотел использовать WITH, но он же не может выступать как sub query?Может.
Надо написать один WITH на весь запрос, но несколько определений CTE, раздёлённых запятыми.
Каждое CTE может обращаться к любому вышестоящему в списке неограниченное количество раз.
После последнего CTE, разумеется, надо написать основной запрос
с возможнстью использования любых определённых в WITH CTE.

Но надо, всё-таки, подумать, может не надо пытаться точно копировать конструкцию в Oracle?
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289135
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда вопрос по hierarchyid. Как с помощью её получить путь от корня до последнего потомка в виде агрегированой строки? Это возможно?
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289147
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
iapErikIХотел использовать WITH, но он же не может выступать как sub query?Может.
Надо написать один WITH на весь запрос, но несколько определений CTE, раздёлённых запятыми.
Каждое CTE может обращаться к любому вышестоящему в списке неограниченное количество раз.
После последнего CTE, разумеется, надо написать основной запрос
с возможнстью использования любых определённых в WITH CTE.

Но надо, всё-таки, подумать, может не надо пытаться точно копировать конструкцию в Oracle?
да он же про рекурсию.
типа каждому манагеру найти его подчиненных и этот подсчет подчиненных зафигачить в cte.
не поможет куча cte через зпт,
ибо манагер меняется, т.е. он якорь передает в cte,
ну т.е. функцию ему надо
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289163
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikI,

hierarchyid и есть агрегированная строка в символьном написании. \1\2\3
Если правильно помню, там есть ограничение на имя узла - то ли 20, то ли 32 символа.
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289165
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вопрос о том, как записи собрать в строку, то ответ есть в FAQ.
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289168
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо не просто забросить а сделать это в рекурсии.
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289187
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hierarchyid работает без рекурсии и эффективнее СТЕ, если требуется за один проход найти ветки нескольких корней. Но надо понимать, что один раз потребуется иерархически пронумеровать каждую запись и эту иерархию поддерживать при добавлении-удалении.
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289189
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
o-o,

Разве сте не поддерживает смену якоря? Мне для каждой строки нужен корректный путь до корня.
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289199
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
держите, разбирайтесь
убегаю
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
create table [dbo].[users](
    [userid] [int] ,
    [username] [varchar](50) ,
    [managerid] [int] ,
   )

insert into dbo.users
    ([userid], [username], [managerid])
values
(1,'aaa',null),
(2,'bbb',1),
(3,'ccc',2),
(4,'ddd',1),
(5,'eee',3),
(6,'fff',5),
(7,'ggg',5),
(8,'hhh',4); 
go

create function dbo.udf_erik(@id int)
returns table
as
return
with usercte
     as (select userid,
                username,
                managerid,
                0 as emplevel
         from   [users]
         where  managerid = @id
         union all
         select usr.userid,
                usr.username,
                usr.managerid,
                mgr.[emplevel] + 1
         from   [users] as usr
                inner join usercte as mgr
                        on usr.managerid = mgr.userid
         where  usr.managerid is not null)
select *
from   usercte as u; 

select *
from dbo.udf_erik(3);
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289207
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
вот ето еще запустите после создания функции
Код: sql
1.
2.
3.
4.
5.
declare @t table(id int);
insert into @t values (1), (5);

select *
from @t cross apply dbo.udf_erik(id);
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39289270
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErikI,

Запрос Оракловый покажите -- можно подумать
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39291268
ErikI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот решение с помощью hierarchyid.
Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
   STUFF(CAST((
  	SELECT [text()] = '-' + [Field]
  	FROM Table
      WHERE @child.IsDescendantOf(hid) = 1
  	FOR XML PATH(''), TYPE) AS VARCHAR(100)), 1, 2, '')
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Миграция ирархического запроса
    #39567427
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o-oда он же про рекурсию.
типа каждому манагеру найти его подчиненных и этот подсчет подчиненных зафигачить в cte.
не поможет куча cte через зпт,
ибо манагер меняется, т.е. он якорь передает в cte,
ну т.е. функцию ему надо


насколько я понял, уровень, на котором расположен каждый подчиненный манагера, тем же запросом тоже получить не удастся
(аналог Ораклового Level)
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39567434
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxo-oда он же про рекурсию.
типа каждому манагеру найти его подчиненных и этот подсчет подчиненных зафигачить в cte.
не поможет куча cte через зпт,
ибо манагер меняется, т.е. он якорь передает в cte,
ну т.е. функцию ему надо
насколько я понял, уровень, на котором расположен каждый подчиненный манагера, тем же запросом тоже получить не удастся
(аналог Ораклового Level)Можно.
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39567435
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажи на примере
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with persons as
(
select N'Степанов' cn, N'' manager union
select N'Петров' , N'Степанов' manager union
select N'Иванов' , N'Степанов' manager union
select N'Сидоров' , N'Петров' manager union
select N'Васькин' , N'Иванов' manager union
select N'Петрыкин', N'Сидоров' manager
),
t as
(
select p.cn, p.manager from persons p where cn like N'%Степанов%'
union all
select p.cn, p.manager from persons p, t where p.manager = t.cn
)select * from t

cnmanagerСтепановИвановСтепановПетровСтепановСидоровПетровПетрыкинСидоровВаськинИванов
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39567436
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм... вроде так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with persons as
(
select N'Степанов' cn, N'' manager union
select N'Петров' , N'Степанов' manager union
select N'Иванов' , N'Степанов' manager union
select N'Сидоров' , N'Петров' manager union
select N'Васькин' , N'Иванов' manager union
select N'Петрыкин', N'Сидоров' manager
),
t as
(
select p.cn, p.manager, 1 level from persons p where cn like N'%Степанов%'
union all
select p.cn, p.manager, t.level+1 from persons p, t where p.manager = t.cn
)select * from t

cnmanagerlevelСтепанов1ИвановСтепанов2ПетровСтепанов2СидоровПетров3ПетрыкинСидоров4ВаськинИванов3
...
Рейтинг: 0 / 0
Миграция ирархического запроса
    #39567484
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxхм... вроде такДа.
Собственно, пример получения уровней есть даже в хелпе, в первом же примере рекурсивного CTE
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Миграция ирархического запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]