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

Откуда:
Сообщений: 177
Есть древовидный справочник. В нём есть поле rubric, в котором имеются значения типа 0.NG2Y.NHJI.NHJK.NHLZ., которое отвечает за древовидность этого справочника. Работает это так.
Запись со значением 0.NG2Y.NHJI.NHJK.NHLZ является потомком для записи со значением 0.NG2Y.NHJI.NHJK., в свою очередь эта запись является потомком для строки со значением 0.NG2Y.NHJI. и так далее до нуля.
Есть ещё одно поле в котором храньится само значение znacenie. Мне нужно вывести полный путь этих значений.
Например если есть таблица:

0.NG2Y.NHJI.NHJK.NHLZ какая то ещё должность
0.NG2Y.NHJI.NHJK. Заместитель министра
0.NG2Y.NHJI. Министр
0.NG2Y. Президент

То при выборе записи с этим значением 0.NG2Y.NHJI.NHJK.NHLZ у меня бы выводилось Президент-Министр-Заместитель министра-какая то ещё должность

Помогите написать запрос
24 июл 14, 16:27    [16352946]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос.  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4248
Версия сервера?
24 июл 14, 16:40    [16353033]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Set666
Запись со значением 0.NG2Y.NHJI.NHJK.NHLZ является потомком для записи со значением 0.NG2Y.NHJI.NHJK., в свою очередь эта запись является потомком для строки со значением 0.NG2Y.NHJI. и так далее до нуля.

Вы хотите сказать, что ваш "древовидный справочник" построен на одном поле rubric ?
24 июл 14, 16:42    [16353042]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
like родитель.% +order by len ?
А как конкатенировать символьные поля в запросе - то посик по форуму или ФАК по нему же
24 июл 14, 16:44    [16353061]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос.  [new]
Set666
Member

Откуда:
Сообщений: 177
автор
Вы хотите сказать, что ваш "древовидный справочник" построен на одном поле rubric ?

Скорей всего да, хотя не уверен,не я эту базу проектировал.
автор
Версия сервера?

2008
24 июл 14, 16:55    [16353165]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос.  [new]
Set666
Member

Откуда:
Сообщений: 177
хотя нашёл я ещё два поля parent_id который ссылается на id
24 июл 14, 17:00    [16353194]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос.  [new]
Set666
Member

Откуда:
Сообщений: 177
У меня мало опыта работы с mssql server. Подскажите есть ли каккая нибудь конструкция для работы с древовидными структурами, типа как connect prior в oracle?
24 июл 14, 17:03    [16353210]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Можно использовать рекурсивные CTE выражения, об этом есть информация в справке с примерами.
24 июл 14, 17:23    [16353328]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8724
У Вас же уже есть полный путь?!
Можно вот таки очевидным говнокодом:
declare @var varchar(max) = '0.NG2Y.NHJI.NHJK.NHLZ'
       ,@i int = 1;
select @var;

-- Кусок говнокода:
while len(@var)>0
  begin
    select SUBSTRING(@var,0,charindex('.',@var+'.'));
    select @var = substring(@var, charindex('.',@var+'.')+1,999999);
  end  
 


Либо вот так:
declare @var varchar(max) = '0.NG2Y.NHJI.NHJK.NHLZ'
       ,@i int;
select @var;

select @i = charindex('.',@var+'.',@i+1); 
while @i != 0
  begin
    select left(@var,charindex('.',@var+'.',@i)-1);
    select @i = charindex('.',@var+'.',@i+1);
    -- select @i
  end 
А так - смотрите по форуму "парсинг строки"...
25 июл 14, 08:25    [16355568]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос.  [new]
west74
Member

Откуда: Челябинск
Сообщений: 76
declare @t table(id_name varchar(100),job_title varchar(100));

insert into @t (id_name,job_title) values
('0.NG2Y.NHJI.NHJK.NHLZ','какая то ещё должность'),
('0.NG2Y.NHJI.NHJK','Заместитель министра'),
('0.NG2Y.NHJI','Министр'),
('0.NG2Y','Президент');


with t1 as (
select id_name,job_title
from @t where id_name='0.NG2Y.NHJI.NHJK.NHLZ'
union all
select substring(t.id_name,1,len(t.id_name)-CHARINDEX('.',reverse(t.id_name))) id_name,
t2.job_title
from @t t
join t1 on t1.id_name=t.id_name
join @t t2 on t2.id_name=substring(t1.id_name,1,len(t1.id_name)-CHARINDEX('.',reverse(t1.id_name)))
)

select distinct T11.aa,replace(
(select T.job_title as 'data()' from (select job_title,id_name, MAX(id_name) over () aa from t1 ) as T where T.aa = t11.aa order by LEN(T.id_name) for xml path(''))
, ' ', '-') aa
from (select job_title,id_name, MAX(id_name) over () aa from t1 ) t11
25 июл 14, 09:44    [16355726]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить