сложный запрос

Лысый
Дата: 10.10.2003 17:46:31
тема такая, прогаю под Веб
надо скорость
поэтому пользуюсь SqlDataReader class for a fast forward-only data cursor в АСП.НЕТ
но не суть
тема такая, из-за форвард онли, надо выбрать из обычного иерархического каталога (таблица описаний и таблица связей отец-сын) все записи о разделах, в такой последовательности
раздел
подраздел
подраздел
подподраздел
подподраздел
подраздел
подраздел

и тд, думаю поятно

вот проблемма составить такой скл запрос, знатоки, помогите :(
Гнездин Петр
Дата: 10.10.2003 18:41:42
Лысый
Дата: 10.10.2003 19:31:39
это прекрасно, но у него данные хранятся по другому
Гнездин Петр
Дата: 10.10.2003 19:42:34
Так покажите свою структуру таблиц.
Лысый
Дата: 10.10.2003 20:00:43
так я ж написал:
таблица записей с ИД и лабудой
и таблица с парами ИД из первой, короче, отец-сын
всё как обычно :(
Гость2
Дата: 10.10.2003 20:38:55
Предполагается что исходные таблицы:
relations_table(parent int, baby_id int) - связи
description_table(id int, description varchar(255)) - данные

Предлагаю следующую процедуру. Только не тестировал ее.
Попробуйте, может сработает.

@source_id - параметр в процедуру - идентификатор главного предка

declare @source_id int

set @source_id=1

declare @age int
set @age=0

declare @t table(c int, age int, order_f varchar(8000))

insert @t values(@source_id, 0, '')

insert @t select baby_id, 1, convert(char(4), cast(baby_id as binary(4)))
from relations_table as a
where a.parent=@source_id

while(@@ROWCOUNT>0)
begin
set @age=@age+1
insert @t select baby_id, @age, b.order_f+convert(char(4), cast(baby_id as binary(4)))
from relations_table as a inner join @t as b on @age=b.age and b.c=a.parent
where a.parent=@source_id
end

select b.description
from @t as a inner join description_table as b on a.c=b.id
order by a.order_f
Гнездин Петр
Дата: 10.10.2003 21:11:23
2 Лысый: Если все "как обычно", то чем не устраивают стандартные решения?
Просто везде надо заменить выборку из одной таблицы на выборку из джойна двух таблиц (в случае, если нужна сортировка) либо джойнить окончательный результат с таблицей описаний, если сортировка не нужна.

p.s. Кстати pwr.ru - мой сайт, так что конкретно по этой статье могу дать дополнительные комментарии в случае необходимости
Гость2
Дата: 11.10.2003 09:49:16
Потестил, лучше вот так:

declare @source_id int

set @source_id=1

declare @age int
set @age=0

declare @t table(c int, age int, order_f varbinary(8000))

insert @t values(@source_id, 0, cast(@source_id as binary(4)))

insert @t select baby_id, @age+1, b.order_f+cast(baby_id as binary(4))
from relations_table as a inner join @t as b on b.c=a.parent and b.age=@age

while(@@ROWCOUNT>0)
begin
set @age=@age+1
insert @t select baby_id, @age+1, b.order_f+cast(baby_id as binary(4))
from relations_table as a inner join @t as b on b.c=a.parent and b.age=@age
end

select b.description
from @t as a inner join description_table as b on a.c=b.id
order by a.order_f


А вот этот вариант можно использовать, если необходима сортировка элементов одного уровня:

declare @source_id int

set @source_id=1

declare @age int
set @age=0

declare @t table(id int identity(1,1), c int, age int, order_f varbinary(8000), stub bigint)

insert @t(c, age, order_f, stub) values(@source_id, 0, cast(@source_id as binary(4)), null)

insert @t(c, age, order_f, stub) select baby_id, @age+1, b.order_f, 0
from relations_table as a inner join @t as b on b.c=a.parent and b.age=@age
inner join description_table as c on a.baby_id=c.id
order by c.description

while(@@ROWCOUNT>0)
begin
set @age=@age+1
update @t set order_f=order_f+cast(id as binary(4)), stub=null where age=@age
insert @t(c, age, order_f, stub) select baby_id, @age+1, b.order_f, 0
from relations_table as a inner join @t as b on b.c=a.parent and b.age=@age
inner join description_table as c on a.baby_id=c.id
order by c.description
end

select b.description
from @t as a inner join description_table as b on a.c=b.id
order by a.order_f
Лысый
Дата: 13.10.2003 11:30:28
да... видать что-то я ещё глупенький, сходу не догоняю :(
но буду разбираться
ВСЕМ СПАСИБО.
c00lw09
Дата: 13.10.2003 12:10:31
Mda,

Ya ne vizhu kak eto budet rabotat' tak kak eta query ne budet delat' to chto nuzhno. Vibor desription ne budet rabotat', tak kak tol'ko po description nel'zya postroit' derevo, a immeno eto i nado. luchshe ispol'zovat' DataSet i tuda prosto kinut' ves' table i isposzuya DataView postroit' derevo.