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

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

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

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

Разве сте не поддерживает смену якоря? Мне для каждой строки нужен корректный путь до корня.
...
Рейтинг: 0 / 0
09.08.2016, 17:56:55
    #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
09.08.2016, 17:59:26
    #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
09.08.2016, 19:51:11
    #39289270
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция ирархического запроса
ErikI,

Запрос Оракловый покажите -- можно подумать
...
Рейтинг: 0 / 0
12.08.2016, 17:53:32
    #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
Период между сообщениями больше года.
10.12.2017, 23:15:01
    #39567427
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция ирархического запроса
o-oда он же про рекурсию.
типа каждому манагеру найти его подчиненных и этот подсчет подчиненных зафигачить в cte.
не поможет куча cte через зпт,
ибо манагер меняется, т.е. он якорь передает в cte,
ну т.е. функцию ему надо


насколько я понял, уровень, на котором расположен каждый подчиненный манагера, тем же запросом тоже получить не удастся
(аналог Ораклового Level)
...
Рейтинг: 0 / 0
10.12.2017, 23:45:53
    #39567434
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция ирархического запроса
andreymxo-oда он же про рекурсию.
типа каждому манагеру найти его подчиненных и этот подсчет подчиненных зафигачить в cte.
не поможет куча cte через зпт,
ибо манагер меняется, т.е. он якорь передает в cte,
ну т.е. функцию ему надо
насколько я понял, уровень, на котором расположен каждый подчиненный манагера, тем же запросом тоже получить не удастся
(аналог Ораклового Level)Можно.
...
Рейтинг: 0 / 0
10.12.2017, 23:56:53
    #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
11.12.2017, 00:00:05
    #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
11.12.2017, 08:37:41
    #39567484
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Миграция ирархического запроса
andreymxхм... вроде такДа.
Собственно, пример получения уровней есть даже в хелпе, в первом же примере рекурсивного CTE
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Миграция ирархического запроса / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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