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

Откуда:
Сообщений: 33
Форумчане, добрый день! Прошу попомщи в построении рекурсивного запроса на T-SQL
(MS SQL server 2008R2)

Есть выгрузка из другой БД. Выглядит она таким образом

К сообщению приложен файл. Размер - 115Kb
18 мар 14, 13:02    [15744775]     Ответить | Цитировать Сообщить модератору
 Re: Построение рекурсивного запроса T-SQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx
18 мар 14, 13:03    [15744802]     Ответить | Цитировать Сообщить модератору
 Re: Построение рекурсивного запроса T-SQL  [new]
k_mak
Member

Откуда:
Сообщений: 33
сорри, продолжение

в этой таблице хранятся отношения ролей в системе (т.е одна роль, содержит другую, другая третью и т.д...максимальное вложение, которое нашел там - 5)

Можно-ли как-нибудь стандартными средствами рекурсивного запроса привести данную таблицу к такому виду для последующей выгрузки в excel?
[img=]


в инете взял пример рекурсивного запроса и по аналогии сделал такое
with tlevel(subj_name, owner_name, final_granted, level)
as
(
select subj_name, owner_name, final_granted, 0 as level
from vcftmembertest a
union all
select a.subj_name, a.owner_name, a.final_granted, tl.level + 1
from vcftmembertest a
inner join tlevel tl
on a.subj_name = tl.subj_name
)
select subj_name, owner_name, final_granted, level
from tlevel

но он, естественно нифига не работает

можете подсказать что и кfк тут изменить(если можно), чтоб получить рабочий вариант?
и еще: можно-ли как-нибудь написать запрос, чтобы по мере появления вложенности ролей добавлялись столбцы(granted throught n)?

К сообщению приложен файл. Размер - 146Kb
18 мар 14, 13:07    [15744852]     Ответить | Цитировать Сообщить модератору
 Re: Построение рекурсивного запроса T-SQL  [new]
aleks2
Guest
Нафига вам горизонтальное представление?

Сделайте "вертикальное" и фсе станет проще, фсе станет веселей.
18 мар 14, 13:15    [15744931]     Ответить | Цитировать Сообщить модератору
 Re: Построение рекурсивного запроса T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
k_mak, это пользовательское представление данных, не путайте его со способом хранения дерева в базе.
Постарайтесь получить данные именно из БД в "сыром" виде.
18 мар 14, 14:24    [15745683]     Ответить | Цитировать Сообщить модератору
 Re: Построение рекурсивного запроса T-SQL  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
declare @table table (subj_name varchar(100), owner_name varchar(100))
insert into @table values('level5','level4'),('level4','level3'),('level3','level2'),('level2','level1'),('level1','level1')
insert into @table values('level_2','level_1'),('level_21','level_1'),('level_31','level_1'),('level_1','level_1')


;with step(subj_name, owner_name,[path],[level]) as
(select subj_name, owner_name, cast(subj_name as varchar(max)) as [path], cast(0 as int) as [level]
 from @table where subj_name = owner_name
union all 
select t.subj_name, t.owner_name, s.[path]+t.subj_name as [path], s.[level]+1
 from step s
 join @table t  on t.owner_name = s.subj_name and  t.owner_name <> t.subj_name
)
select replicate(' ',[level]*2)+subj_name from step
order by [path]
18 мар 14, 14:28    [15745726]     Ответить | Цитировать Сообщить модератору
 Re: Построение рекурсивного запроса T-SQL  [new]
k_mak
Member

Откуда:
Сообщений: 33
aleks2, если б это была моя воля..)
LexusR, спасибо, сейчас посомтрю что там как происходит=)
Владислав Колосов, если я правильно понял,то именно так и хранятся данные в БД в "сыром виде"
p.s - база - прилинкованный сервер

запрос типа
select * from SUBJ_EQUAL where subj_id = 'AKAM'

выдает результат
SUBJ_ID------EQUAL_ID------OWNER_ID
AKAM---------AKAM-------------AKAM ///// АКАМ все свои права он получает "сам через себя" =)
AKAM---------EMPLOYEE----MANAGER ///// АКАМ получает права EMPLOYEE, т.к является членом MANAGER
AKAM---------INTERN-----------MANAGER ///// АКАМ получает права INTERN, т.к является членом MANAGER
AKAM---------MANAGER------AKAM ///// Получает права MANAGER через прямое включение в групппу
ADMIN-------EMPLOYEE-----ADMIN ////
[img=]

вот такая вот иерархия в системе наследования ролей..

К сообщению приложен файл. Размер - 2Kb
18 мар 14, 14:58    [15746064]     Ответить | Цитировать Сообщить модератору
 Re: Построение рекурсивного запроса T-SQL  [new]
Владислав Колосов
Member

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

обычно дерево выглядит так:

name       ID parentID
qwe 1 0
qwe.asd 2 1
18 мар 14, 16:01    [15746813]     Ответить | Цитировать Сообщить модератору
 Re: Построение рекурсивного запроса T-SQL  [new]
k_mak
Member

Откуда:
Сообщений: 33
Владислав Колосов, да, видел это в статьях...
но мне, к сожалению, предоставили тока вид, как указывал выше на скриншотах..
ладно, всем откликнувшимся спасибо за помощь..попробую сейчас полазить по всем табличкам линк сервера, может нарою то,что нужно =)

LexusR, еще раз спасибо, запрос немног подредактил, вроде срабатывает, отложил в варианты решения=)
18 мар 14, 16:10    [15746932]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить