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

Откуда:
Сообщений: 257
Добрый день.

Никак не могу понять как реализовать в одном запросу

Есть таблица
Id
Central
Parent

Select id,central,parent from table
Если parent is not null то тогда берем parent и подставляем его
Select id, central, parent from table where Id= parent
Если во втором случае parent is null то берем central его тащим в резалсет

Помогите составить одним запросом, если правильно выражаюсь то заранее неизвестно сколько раз надо подняться наверх неизвестно
7 авг 13, 14:14    [14675814]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться как составить запрос  [new]
_djХомяГ
Guest
если версия сервера позволяет - рекурсивное CTE
7 авг 13, 14:17    [14675836]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться как составить запрос  [new]
user87
Member

Откуда:
Сообщений: 257
Сервер 2000
7 авг 13, 14:26    [14675907]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться как составить запрос  [new]
Гость333
Member

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

А почему нужно именно одним запросом?
7 авг 13, 14:28    [14675926]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться как составить запрос  [new]
user87
Member

Откуда:
Сообщений: 257
У меня уже есть запрос другой, далее отдельным откотором здесь отписался получу central и добавлю к первому запросу результат, надеюсь понятно рассказал
7 авг 13, 14:32    [14675950]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться как составить запрос  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
если нельзя рекурсию - собирай дерево в цикле
--исходная таблица(тестовые данные)
IF OBJECT_ID('tempdb..#table') is not null drop table #table
select 1 as id, cast('root' as varchar(max))  as Central,null as Parent
into #table
union select 2,'level1_1',1
union select 3,'level1_2',1
union select 4,'level2_1',2
union select 5,'level2_2',3

--запрос

IF OBJECT_ID('tempdb..#result') is not null drop table #result
select * into #result from #table
while @@ROWCOUNT>0
 update t0  set t0.Parent = t1.Parent, t0.Central = t1.Central+'/'+t0.Central 
 from  #result t0
 join  #result t1 on t1.id = t0.Parent
 where not exists(select * from #result t2 where t2.Parent = t0.id)

select * from #result
7 авг 13, 14:43    [14676050]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться как составить запрос  [new]
user87
Member

Откуда:
Сообщений: 257
Спасибо большое, если не затруднит дома стоит 2008, но про cte рекурсии еще скажем так не слышал, а как выглядел бы запрос с использованием cte
7 авг 13, 14:56    [14676138]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться как составить запрос  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
--исходная таблица(тестовые данные)
IF OBJECT_ID('tempdb..#table') is not null drop table #table
select 1 as id, cast('root' as varchar(max))  as Central,null as Parent
into #table
union select 2,'level1_1',1
union select 3,'level1_2',1
union select 4,'level2_1',2
union select 5,'level2_2',3

--запрос


 

;with nodes(id,Central,Parent,[level]) as
(select id,cast(Central as varchar(max)),Parent,0 from #table
union all
select n.id,t.Central+'/'+n.Central,t.Parent,n.level+1 
from nodes n
join #table t on t.id = n.Parent)
select top 1 with ties id,Central
from nodes
order by ROW_NUMBER()OVER(partition by id order by [level] desc)
7 авг 13, 14:57    [14676152]     Ответить | Цитировать Сообщить модератору
 Re: Не могу разобраться как составить запрос  [new]
user87
Member

Откуда:
Сообщений: 257
Спасибо большое за помощь.
8 авг 13, 00:26    [14678728]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить