Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2010, 12:17   #1
forzi
Пользователь
 
Регистрация: 04.05.2008
Сообщений: 14
По умолчанию sql запрос - как упростить

Здравствуйте у меня такой вопрос. Подключаю базу firebird 2.1 к delphi 7, в ADOQuery нужно прописать sql запрос, он у меня выглядит так:
Код:
select 
      (select s_value from srv_session where srvs_id=sheets_journal.session),
      (select
           (select name from e_forms where eform_id=groups.eform),
               eform from groups where group_id=sheets_journal.groupid),
      (select
           (select
                (select shortname from faculties where fc_id=specialities.faculty_id),
                     faculty_id from specialities where spc_id=groups.speciality),
                 speciality from groups where group_id=sheets_journal.groupid),
      (select
           (select
                (select fio from faculties where fc_id=specialities.faculty_id),
                      faculty_id from specialities where spc_id=groups.speciality),
                speciality from groups where group_id=sheets_journal.groupid),          syear, rate from sheets_journal
и я понимаю, что он страшный и в нем куча вложений, и он не работает =) выдает ошибку count of column list and variable list do not match, если я правильно понимаю, то это firebird отказывается работать со вложенными запросами, поэтому мне надо как то упростить с помощью JOIN, а я к сожалению не понимаю как =( помогите, пожалуйста
Американский форум: задал вопрос - получил ответ.
Израильский форум: задал вопрос - получил вопрос.
Русский форум: задал вопрос и потом долго выслушиваешь какой ты мудак.
forzi вне форума Ответить с цитированием
Старый 05.04.2010, 18:37   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

а почему нельзя все таблицы просто умножить между собой?
soleil@mmc вне форума Ответить с цитированием
Старый 06.04.2010, 09:01   #3
forzi
Пользователь
 
Регистрация: 04.05.2008
Сообщений: 14
По умолчанию

не знаю как не получается
Американский форум: задал вопрос - получил ответ.
Израильский форум: задал вопрос - получил вопрос.
Русский форум: задал вопрос и потом долго выслушиваешь какой ты мудак.
forzi вне форума Ответить с цитированием
Старый 06.04.2010, 10:00   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
forzi
А что вообще нужно сделать с базой?
Какое задание?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2010, 10:31   #5
forzi
Пользователь
 
Регистрация: 04.05.2008
Сообщений: 14
По умолчанию

Сложно наверн будет описать =) В общем нужен отчет, сделанный в fastreport, и данные в этом отчете из разных таблиц. Мой запрос описывает выдергивание наименования сессии, имя препода, номер группы и т.д. и вроде правильно описывает, но не работает =)
Американский форум: задал вопрос - получил ответ.
Израильский форум: задал вопрос - получил вопрос.
Русский форум: задал вопрос и потом долго выслушиваешь какой ты мудак.
forzi вне форума Ответить с цитированием
Старый 06.04.2010, 10:52   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Сложно наверн будет описать
Да уж... Тут пожалуй стрктуру таблиц нужно знать, но по-моему этот запрос уж дюже сложен...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2010, 10:54   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,532
По умолчанию

конструкция вида
Код:
select fi1, (select f2 from t2 where t2.id=t1.id) from t1
заменена на
Код:
select t1.f1, t2.f2 from t1  left join t2 on t2.id=t1.id)
первая итерация сокращения
изменены самые внутренние блоки
размеры те же читаемость

Код:
select 
      srv_session.s_value
 ,    (  select e_forms.name,  eform 
        from groups 
        left join e_forms on eform_id=groups.eform
        where group_id=sheets_journal.groupid
      )
,     (  select
                   ( select faculties.shortname, faculty_id 
                     from specialities 
                     left join faculties on fc_id=specialities.faculty_id
                     where spc_id=groups.speciality
                    )
         ,     speciality 
         from groups where group_id=sheets_journal.groupid
     )
,    ( select
           ( select faculties.fio, faculty_id 
             from specialities  
             left join faculties on fc_id=specialities.faculty_id
             where spc_id=groups.speciality
           )
     , speciality 
     from groups where group_id=sheets_journal.groupid
     )
,  syear, rate 
from sheets_journal
left join srv_session on srvs_id=sheets_journal.session
окночательно
Код:
select 
      srv_session.s_value
,    e_forms.name,  eform 
,     select faculties.shortname, specialities.faculty_id, speciality, faculties.fio, faculty_id, speciality  
,  syear, rate 
from sheets_journal
     left groups on group_id=sheets_journal.groupid
     left join e_forms on eform_id=groups.eform
     left join specialities spc_id=groups.speciality
     left join faculties on fc_id=specialities.faculty_id
left join srv_session on srvs_id=sheets_journal.session
это то что предлагали вначале (произведение таблиц) только наверное надо будет кое-где к наименованиям полей дописать имена таблиц для снятия неоднозначности
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.04.2010 в 11:11.
evg_m вне форума Ответить с цитированием
Старый 06.04.2010, 11:57   #8
forzi
Пользователь
 
Регистрация: 04.05.2008
Сообщений: 14
По умолчанию

Спасибо всем за советы
evg_m Сделала как Вы сказали, все получилось, спасибо
Американский форум: задал вопрос - получил ответ.
Израильский форум: задал вопрос - получил вопрос.
Русский форум: задал вопрос и потом долго выслушиваешь какой ты мудак.
forzi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
Подскажите как поправить SQL запрос МишаК SQL, базы данных 3 16.07.2009 16:22
Как выполнить SQL запрос, записанный в Memo artemavd БД в Delphi 8 26.03.2009 17:41
как составит запрос SQL bmb_66 БД в Delphi 2 11.03.2008 08:46
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15