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

Откуда:
Сообщений: 102
Привет всем. Есть две таблицы:
tb_registr (id int) - в ней номера реестров
tb_registrdetail (id int, registrid int, prop varchar(10), value int) - детализация реестров
Таблицы связаны отношением "один ко многим" по полям tb_registr.id = tb_registrdetail.registrid, то есть одной записи в таблице tb_registr может соответствовать от 0 до 3 записей из таблицы tb_registrdetail.
Задача такая. Есть третья таблица
tb_itog (id int, -- номер реестра
countProp int, -- количество пар prop-value
prop1 varchar(10), -- свойство 1, может быть пустым
value1 int, -- значение свойства 1, может быть пустым
prop2 varchar(10), -- свойство 2, может быть пустым
value2 int, -- значение свойства 2, может быть пустым
prop3 varchar(10), -- свойство 3, может быть пустым
value3 int, -- значение свойства 3, может быть пустым
)
То есть нужно в итоговую таблицу положить - id реестра, количество записей для этого реестра в tb_registrdetail и затем положить в соответствующие поля пары prop-value (если их нет, то ничего).
Подскажите, как лучше сделать, чтоб быстродействие меньше страдало. БД - SQL Server 2000
29 окт 09, 13:17    [7855574]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
rpv
Member

Откуда:
Сообщений: 102
Вот что у меня пока получилось
insert into tb_itog (id)
select id from tb_registr

declare @id int
declare cReestr cursor fast_forward for
select id from #tb_itog

open cReestr

fetch next from cReestr into @id
while @@fetch_status = 0
begin
-- количество записей
update #tb_itog set countProp=(select count(id) from tb_registrdetail where registrId=@id)
where id=@id


fetch next from cReestr into @id
end

close cReestr
deallocate cReestr
29 окт 09, 13:22    [7855632]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
если я прально понял, то:

select t1.name, count(*) colcount 
from sysobjects t1 inner join syscolumns t2
on t1.id=t2.id
group by t1.name
29 окт 09, 13:48    [7855955]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
rpv
Member

Откуда:
Сообщений: 102
Knyazev Alexey
если я прально понял, то:

select t1.name, count(*) colcount 
from sysobjects t1 inner join syscolumns t2
on t1.id=t2.id
group by t1.name

Спасибо за поддержку, но к чему это?
29 окт 09, 14:02    [7856136]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
buven
Member

Откуда:
Сообщений: 792
Вам дали конструкцию, которая вернет вам нужный набор, если вы ее примените к своим таблицам.

Проводить жизнь в ожидании мессии, который придёт и спасёт мир, всё-равно, что ждать палку в тетрисе.
Даже если и появится, то ты к тому времени наберёшь такую гору дерьма, что те будет уже абсолютно пох... :)
29 окт 09, 14:13    [7856299]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
aleks2
Guest

select R.ID, P.*
FROM
tb_registr R
LEFT OUTER JOIN
(select r1.registrid
	, CASE WHEN r1.value is not null then 1 ELSE 0 END
          +CASE WHEN r2.value is not null then 1 ELSE 0 END
          +CASE WHEN r3.value is not null then 1 ELSE 0 END
	 countProp
	, r1.prop prop1, r1.value value1
	, r2.prop prop2, r2.value value2
	, r3.prop prop3, r3.value value3
FROM
tb_registrdetail r1
LEFT OUTER JOIN
tb_registrdetail r2
LEFT OUTER JOIN
tb_registrdetail r3
ON 
r1.registrid=r2.registrid AND r1.registrid=r3.registrid
AND
r1.id<r2.id AND r2.id<r3.id
) P
ON
R.ID=P.registrid
29 окт 09, 14:29    [7856460]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
rpv
Member

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

пишет синтаксическая ошибка в строке
) P
29 окт 09, 14:48    [7856681]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
rpv
aleks2,

пишет синтаксическая ошибка в строке
) P
select R.ID, P.*
FROM
tb_registr R
LEFT OUTER JOIN
(select r1.registrid
	, CASE WHEN r1.value is not null then 1 ELSE 0 END
          +CASE WHEN r2.value is not null then 1 ELSE 0 END
          +CASE WHEN r3.value is not null then 1 ELSE 0 END
	 countProp
	, r1.prop prop1, r1.value value1
	, r2.prop prop2, r2.value value2
	, r3.prop prop3, r3.value value3
FROM
tb_registrdetail r1
LEFT OUTER JOIN
tb_registrdetail r2
LEFT OUTER JOIN
tb_registrdetail r3
ON 
r1.registrid=r2.registrid ON r1.registrid=r3.registrid
AND
r1.id<r2.id AND r2.id<r3.id
) P
ON
R.ID=P.registrid
29 окт 09, 15:05    [7856832]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить