Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизСложный динамический SQL-запрос Найти похожие ветки
← →
BPK (2004-04-29 16:49) [0]MS SQL Server 2000
Имеется таблица 1, каждая строчка которой характеризует один объект.
Имеется таблица 2, содержащая параметры объектов, находящихся в таблице 1 (Поля: Название_параметра, ID_объекта, Тип, Значение). Так сделано потому, что каждый объект содержит свой набор параметров.
Нужно:
Сделать запрос, выводящий в таблицу все объекты со всеми возможными параметрами. Если у какого-нибудь объекта нет такого параметра, то на этом месте должно быть NULL.
Каждое поле результирующего набора данных должно соответствовать определению поля из таблицы2.
Как сделать такой хитрый запрос, чтобы он ещё и не тормозил?
Количество объектов - около 5000, у каждого в среднем по 15 параметров.
← →
Nikolay M. © (2004-04-29 16:56) [1]
> Как сделать такой хитрый запрос
Написать его. Предварительно почитав про LEFT JOIN.
> чтобы он ещё и не тормозил?
> Количество объектов - около 5000, у каждого в среднем по
> 15 параметров.
Чтобы на таких объемах были тормоза, нужно очень постараться.
← →
Johnmen © (2004-04-29 17:00) [2]Особенно бодрит "Сложный"
:)
← →
Курдль © (2004-04-29 17:01) [3]
select * from таблица_1 left join таблица_2 on 2.ID_объекта = 1.ID_объекта
← →
ZrenBy © (2004-04-29 17:04) [4]Эх вы ...
ему ж пивот нужон, наверное
← →
BPK (2004-04-29 17:11) [5]Мужики, а ВНИМАТЕЛЬНО ли вы читали вопрос?
В результирующем запросе надо: один объект - одна строчка, причём столбцы из таблицы 2 преобразуем в поля результирующего запроса, т.е. делаем транспонирование "на лету".
Так что запрос ещё какой СЛОЖНЫЙ!
← →
Курдль © (2004-04-29 17:14) [6]
> Так что запрос ещё какой СЛОЖНЫЙ!
Тогда он может плавно перетечь в невозможный, если заранее не известно предельное значение параметров, а их типы разные.
← →
ZrenBy © (2004-04-29 17:18) [7]http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=88666
← →
Nikolay M. © (2004-04-29 17:19) [8]
> BPK (29.04.04 17:11) [5]
> Мужики, а ВНИМАТЕЛЬНО ли вы читали вопрос?
> В результирующем запросе надо: один объект - одна строчка,
> причём столбцы из таблицы 2 преобразуем в поля результирующего
> запроса, т.е. делаем транспонирование "на лету".
В тупейшем случае, 15 параметров => 15 джойнов таблицы параметров.
← →
Курдль © (2004-04-29 17:49) [9]Могу тока статический :(
select
T1.*,
(select first T2.NAME from таблица_2 T2 where T2.ID = 1 and T2.ID_объекта = T1.ID_объекта) as FIELD_1,
(select first T2.NAME from таблица_2 T2 where T2.ID = 2 and T2.ID_объекта = T1.ID_объекта) as FIELD_2,
...
(select first T2.NAME from таблица_2 T2 where T2.ID = 15 and T2.ID_объекта = T1.ID_объекта) as FIELD_15
from таблица_1 T1
← →
BPK (2004-04-30 11:02) [10]where T2.ID = 1
where T2.ID = 2
where T2.ID = 3
where T2.ID = N
ага, именно так, только эти 1,2,3,N - имена параметров (предварительно нужно автоматически составить список имён параметров и для каждого сделать свой Where)
← →
Ega23 © (2004-04-30 11:23) [11]курсор, динамически генерить "статический" запрос (каламбурчик-то) и потом exec"ать его.
← →
BPK (2004-04-30 11:32) [12]Всё. Вот то, что мне надо, только нужно динамически набирать вложенные select"ы, изменяя имена полей для каждого из них:
select bc.[id],bc.ptype,
(select pa.val from el_el_bcomppars pa
left join el_el_dparamdefs pd on pa.param_id=pd.[id] and pa.comp_id=bc.[id]
where pd.param_name="TOLERANCE") as TOLERANCE,
(select pa.val from el_el_bcomppars pa
left join el_el_dparamdefs pd on pa.param_id=pd.[id] and pa.comp_id=bc.[id]
where pd.param_name="NOMVOLTAGE") as NOMVOLTAGE,
(select pa.val from el_el_bcomppars pa
left join el_el_dparamdefs pd on pa.param_id=pd.[id] and pa.comp_id=bc.[id]
where pd.param_name="NOMCURRENT") as NOMCURRENT,
(select pa.val from el_el_bcomppars pa
left join el_el_dparamdefs pd on pa.param_id=pd.[id] and pa.comp_id=bc.[id]
where pd.param_name="TKE") as TKE,
(select pa.val from el_el_bcomppars pa
left join el_el_dparamdefs pd on pa.param_id=pd.[id] and pa.comp_id=bc.[id]
where pd.param_name="TKR") as TKR,
(select pa.val from el_el_bcomppars pa
left join el_el_dparamdefs pd on pa.param_id=pd.[id] and pa.comp_id=bc.[id]
where pd.param_name="PACKAGE") as PACKAGE,
(select pa.val from el_el_bcomppars pa
left join el_el_dparamdefs pd on pa.param_id=pd.[id] and pa.comp_id=bc.[id]
where pd.param_name="SHORTDESC") as SHORTDESC
from el_el_bcomps bc
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c