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

Откуда: из чайника
Сообщений: 4826
Имеется таблица

id  sub_id6    3
3 1
1 null


Подскажите как запросом можно вывести цепочку последовательности вот такую:

6, 3, 1

?

SQLServer 2008
31 окт 12, 15:20    [13402991]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Свежая струя
Member

Откуда: из чайника
Сообщений: 4826
id  sub_id
6    3
3    1
1   null
31 окт 12, 15:21    [13403000]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Читатель неместный
Guest
6. Если Ваш вопроc связан с созданием какого-то запроса, то предоставление Вами следующих материалов может существенно ускорить нахождение решения:
- скрипты создания таблиц;
- скрипты заполнения этих таблиц тестовыми данными;
- описание желаемого результата на примере тестовых данных.
(эти данные лучше офрмлять с использованием специальных тэгов, которые повысят их читабельность. Вот пример хорошего стиля )
Подумайте также над тем, чтобы описать решаемую Вами задачу целиком. Возможно, что тот способ решения, который Вы стремитесь воплотить в жизнь, не является наилучшим, а лишь кажется Вам таковым. Например, вместо вопроса "Как добавить несколько полей в системную таблицу sysusers?" лучше спросить "Как мне хранить дополнительную информацию, привязанную к пользователю бд? Можно ли для этого использовать системную таблицу sysusers?"
(Пример НЕправильно оформоленного вопроса)

31 окт 12, 15:23    [13403022]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Свежая струя
Member

Откуда: из чайника
Сообщений: 4826
Читатель неместный,

вроде наглядно все...
31 окт 12, 15:25    [13403036]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Свежая струя
Читатель неместный,

вроде наглядно все...
Делается функция с переменной: SELECT @a = @a+ ', '+.... FROM ...
31 окт 12, 15:28    [13403057]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Свежая струя
Member

Откуда: из чайника
Сообщений: 4826
LSV
Свежая струя
Читатель неместный,

вроде наглядно все...
Делается функция с переменной: SELECT @a = @a+ ', '+.... FROM ...


Непонятно

Тут надо имено так сделать выборку, чтобы она связаная была.

Если sub_id = null то это конечная точка результата запроса.


Т.е. берем 6, субид у него 3, ищем 3 в ид.

у 3 субид 1 - ищем 1 ид,

у 1 в ид субид=null - значит цепочка завершилась.
31 окт 12, 15:32    [13403077]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
неместный1
Guest
Свежая струя
Читатель неместный,

вроде наглядно все...


lol а я подумал вам надо траспонировать матрицу, взять одну строчку и выкинуть нулл...
31 окт 12, 15:36    [13403104]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Свежая струя
Member

Откуда: из чайника
Сообщений: 4826
неместный1
Свежая струя
Читатель неместный,

вроде наглядно все...


lol а я подумал вам надо траспонировать матрицу, взять одну строчку и выкинуть нулл...



ненене, тут все сложнее... :)
31 окт 12, 15:37    [13403118]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Свежая струя
Member

Откуда: из чайника
Сообщений: 4826
Функция мож есть какая, которая это делает?
31 окт 12, 15:39    [13403129]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
declare @treeTable table(id int,sub_id int )
insert into @treeTable (id,sub_id)
values(6, 3)
,(3, 1)
,(1, null)



;with tree as(
select
rootId= id
,lev = 0
,childId = id
,currId = id
,strVal = CAST(id as varchar(max))
from @treeTable
where sub_id is null
union all
select rootId= tree.rootId
,lev = tree.lev+1
,childId = t.id
,currId = t.id
,strVal = strVal+','+CAST(id as varchar(max))
from @treeTable t
inner join tree
on tree.childId = t.sub_id

)


select
max(strList.val)
,rootId
from tree t1
cross apply(select
STUFF(
(
SELECT ', ' + CAST(currId AS VARCHAR(MAX))
FROM tree t2
order by lev desc
FOR XML PATH(''), TYPE
).value('.','varchar(max)')
,1,2, ''
) val ) strList
group by rootId
31 окт 12, 15:45    [13403167]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
если там порядок склейки не важен, то можно так
;with tree as(
select
rootId= id
,lev = 0
,childId = id
,currId = id
,strVal = CAST(id as varchar(max))
from @treeTable
where sub_id is null
union all
select rootId= tree.rootId
,lev = tree.lev+1
,childId = t.id
,currId = t.id
,strVal = strVal+','+CAST(id as varchar(max))
from @treeTable t
inner join tree
on tree.childId = t.sub_id

)


select 
MAX(strVal)
from tree
group by rootId
31 окт 12, 15:47    [13403176]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
неместный1
Guest
select x1.id,x2.sub_id from (select 6 as id, 3 as sub_id
union
select 3 , 1
union
select 1, 0
union
select 0, null

)x1
left join
(select 6 as id, 3 as sub_id
union
select 3 , 1
union
select 1, 0
union
select 0, null
)x2
on x1.sub_id=x2.id
where sub_id is not null
31 окт 12, 15:47    [13403185]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Sgt.Pepper
Member

Откуда: spb
Сообщений: 1166
Свежая струя
ненене, тут все сложнее... :)

Таинственный Вы какой!

Ну допустим:
select distinct id
from <table>
order by id desc
для приведенных исходных данных даст правильный результат...
Или напиши нормально что хочешь получить...
31 окт 12, 15:48    [13403188]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
неместный1
Guest
select 6 as id, 3 as sub_id into test
union
select 3 , 1
union
select 1, 0
union
select 0, null


select x1.id,x2.sub_id from test x1
left join 
test x2
on x1.sub_id=x2.id
where sub_id is not null

вот читабельнее
31 окт 12, 15:50    [13403203]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Свежая струя,

Функциb нет, но можно это сделать, например, задействовав рекурсивные CTE.
Посмотрите примерчики, начиная с Г.
31 окт 12, 15:51    [13403205]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Свежая струя
Member

Откуда: из чайника
Сообщений: 4826
Мистер Хенки
declare @treeTable table(id int,sub_id int )
insert into @treeTable (id,sub_id)
values(6, 3)
,(3, 1)
,(1, null)



;with tree as(
select
rootId= id
,lev = 0
,childId = id
,currId = id
,strVal = CAST(id as varchar(max))
from @treeTable
where sub_id is null
union all
select rootId= tree.rootId
,lev = tree.lev+1
,childId = t.id
,currId = t.id
,strVal = strVal+','+CAST(id as varchar(max))
from @treeTable t
inner join tree
on tree.childId = t.sub_id

)


select
max(strList.val)
,rootId
from tree t1
cross apply(select
STUFF(
(
SELECT ', ' + CAST(currId AS VARCHAR(MAX))
FROM tree t2
order by lev desc
FOR XML PATH(''), TYPE
).value('.','varchar(max)')
,1,2, ''
) val ) strList
group by rootId




Ого!!!! Спасибо!!!! Сейчас попробую!

Но видимо это то что надо!
31 окт 12, 15:52    [13403215]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Свежая струя
Member

Откуда: из чайника
Сообщений: 4826
SomewhereSomehow
Свежая струя,

Функциb нет, но можно это сделать, например, задействовав рекурсивные CTE.
Посмотрите примерчики, начиная с Г.


Да, спасибо :)
31 окт 12, 15:57    [13403244]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Свежая струя,

для двух последовательностей у меня не работает
DECLARE @tab TABLE (id int, sub_id int)
INSERT INTO @tab (id, sub_id) VALUES (6, 3)
INSERT INTO @tab (id, sub_id) VALUES (3, 1)
INSERT INTO @tab (id, sub_id) VALUES (1, null)
--INSERT INTO @tab (id, sub_id) VALUES (4, 2)
--INSERT INTO @tab (id, sub_id) VALUES (2, null)
  
;WITH cte (id, sub_id, cn) AS 
    (SELECT id, sub_id, 0 AS cn FROM @tab WHERE sub_id IS NULL
    UNION ALL
    SELECT t1.id, t1.sub_id, cn + 1 FROM @tab t1
        INNER JOIN cte t2
        ON t1.sub_id = t2.id  
    ) 
SELECT CONVERT(varchar(max), STUFF(
(SELECT ', ' +  CONVERT(varchar(4),id) FROM cte
ORDER BY id DESC   
FOR xml PATH('')
), 1, 2, '')) 
31 окт 12, 15:58    [13403250]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Свежая струя
Member

Откуда: из чайника
Сообщений: 4826
неместный1
select 6 as id, 3 as sub_id into test
union
select 3 , 1
union
select 1, 0
union
select 0, null


select x1.id,x2.sub_id from test x1
left join 
test x2
on x1.sub_id=x2.id
where sub_id is not null

вот читабельнее



Тоже вариант, спасибо :)
31 окт 12, 15:59    [13403257]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
;with tree as(
select 
 rootId= id
 ,lev = 0
 ,childId = id
 ,currId = id
 ,strVal = CAST(id as varchar(max))
from @treeTable
where sub_id is null
union all
select rootId= tree.rootId
 ,lev = tree.lev+1
 ,childId = t.id
 ,currId = t.id
 ,strVal = strVal+','+CAST(id as varchar(max))
from	@treeTable t
		inner join tree
		on tree.childId = t.sub_id

)



select
 max(strList.val)
 ,rootId
from	tree t1
		cross apply(select
					 STUFF(
					(
					SELECT ', ' + CAST(currId AS VARCHAR(MAX)) 
					FROM tree  t2
					where t2.rootId = t1.rootId		
					order by lev desc
					FOR XML PATH(''), TYPE
					).value('.','varchar(max)')
					,1,2, ''
					) val ) strList
group by rootId
31 окт 12, 16:08    [13403317]     Ответить | Цитировать Сообщить модератору
 Re: Помогите со солжным запросом.  [new]
tetxx
Member

Откуда:
Сообщений: 297
Тред не читал.
;with tree as (
  select t.id, t.sub_id, sourceid=id, path=cast(id as varchar(max))
  from @tab t
  where not exists (select 1 from @tab t2 where t2.sub_id = t.id)
  union all
  select t.id, t.sub_id, sourceid, path + ',' + cast(t.id as varchar(max))
  from @tab t
  inner join tree tt on tt.sub_id = t.id
)
select sourceid, path from tree where sub_id is null
1 ноя 12, 01:52    [13405745]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить