Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1083049279
Masa
2004-04-27 11:01
2004.05.23
Как связать TQuery с другим DataSet ?


1-1083927840
NovyeVasyuki
2004-05-07 15:04
2004.05.23
Запускаю RAR через CreateProcess. Как свернуть окно MS-DOS ?


1-1084260941
Mameluke
2004-05-11 11:35
2004.05.23
Управление работой MS Word из Delphi


1-1083924175
kull
2004-05-07 14:02
2004.05.23
Как избавиться от goto?


6-1080829133
serg128
2004-04-01 18:18
2004.05.23
Как переслать сокетом файл большого размера (1Мб)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский