![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Интересный запрос с группировкой [D7, IB6.x, MSSQL, MySQL, Paradox, SybASE]
Russko © (2005-07-09 14:09:00)Есть такой запрос:
select dogovor,shifr,sum(t_PZ+T_SHT*NUM*NUM_DOG) from main_base
group by dogovor,shifr having (dogovor="389")
Всё бы хорошо, но в произведении стоит поле NUM, мне необходимо, чтобы числа в этом поле тоже были просуммированы аналогичной группировкой, т.е. что-то типа:
select dogovor,shifr,sum(NUM) from main_base
group by dogovor,shifr having (dogovor="389")
а уже потом полученные обновленные значения NUM использоватлись в первом запросе.
Помогите мне объединить эти 2 запроса, если это возможно.
}{ander (2005-07-10 11:23:00) [1]
having (dogovor="389")
Очень странный having...
Ты лопатишь всю таблицу со всякими суммами и произведениями, а уже после этого выбираешь одну (две, три ... пять) нужную запись :-(
Что мешает вместо этого написать:
where (dogovor="389")
И, соответственно, индекс по полю dogovor. Будет летать :-)
P.N.P. (2005-07-09 16:13:00) [2]>Russko (09.07.05 15:58) [20]
Это сюда:
http://www.ibase.ru/develop.htm
см. "Оптимизация запросов, производительность"
Russko (2005-07-09 15:58:00) [3]Во, создал простой индекс на поля dogovor и shifr и запрос проснулся, спасибо P.N.P. и Ольга.
Но тут вопрос - поскольку с индексами я новичок,то что плохого можно от них ожидать?
Russko (2005-07-09 15:52:00) [4]Даже если и обзаведусь - проблемы не решит ((
P.N.P. (2005-07-09 15:51:00) [5]>Russko (09.07.05 15:50) [17]
Попробуй обзавестись, ибо полезно должно быть :)
Russko (2005-07-09 15:50:00) [6]Нет, индексами не обзавёлся за ненадобностью.
P.N.P. (2005-07-09 15:48:00) [7]Индексы-то есть по dogovor,shifr?
Вот, к примеру, планы запроса (11680 records)
select e.name,sum(e.id),sum(e.id*4*
(select sum(ee.id) from mkb ee where ee.name=e.name))
from mkb e
group by 1
С индексом:
План
PLAN (EE INDEX (MKB_IDX1))
PLAN (E ORDER MKB_IDX1)
Адаптированный план
PLAN (EE INDEX (MKB_IDX1)) PLAN (E ORDER MKB_IDX1)
------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0,00 ms
Current memory = 1 137 592
Max memory = 1 265 720
Memory buffers = 3 000
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 2 395
Без индекса:
План
PLAN (EE NATURAL)
PLAN SORT ((E NATURAL))
Адаптированный план
PLAN (EE NATURAL) PLAN SORT ((E NATURAL))
------ Performance info ------
Prepare time = 0ms
Execute time = 2s 688ms
Avg fetch time = 206,77 ms
Current memory = 1 129 272
Max memory = 1 265 720
Memory buffers = 3 000
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 3 458 738
Russko (2005-07-09 15:43:00) [8]Запсей около 1500, но я выполняю запрос на сервере с 2 Гб памяти ((
Ольга (2005-07-09 15:42:00) [9]А записей в таблице много? Внутренний запрос будет выполняться для каждой из них. Так что может запрос не виснет, а просто долго выполняется?
Russko (2005-07-09 15:38:00) [10]2P.N.P.
Зависания продолжаются (((
P.N.P. (2005-07-09 15:36:00) [11]>Russko (09.07.05 15:33) [9]
Убрери group by m2.dogovor,m2.shifr having (m2.dogovor="389")
из вложенного запроса.
Russko (2005-07-09 15:34:00) [12]2Ольга
Ага именно вовложенный запрос во FROM, ругается на select.
P.N.P. (2005-07-09 15:34:00) [13]>Ольга (09.07.05 15:32) [8]
select from select тоже не поддерживается в текущих версиях.
Russko (2005-07-09 15:33:00) [14]
select m1.dogovor,m1.shifr,sum(m1.t_PZ+m1.T_SHT*(
select sum(m2.NUM) from main_base m2 where (m2.dogovor = m1.dogovor) and (m2.shifr = m1.shifr)
group by m2.dogovor,m2.shifr having (m2.dogovor="389")
)*m1.NUM_DOG) from main_base m1 group by m1.dogovor,m1.shifr having (m1.dogovor="389")
Ольга (2005-07-09 15:32:00) [15]Да здесь особых фокусов-то нет. А что не позволяет делать в FireBird, вложенный запрос во FROM?
P.N.P. (2005-07-09 15:31:00) [16]Текст запроса покажи.
Russko (2005-07-09 15:27:00) [17]А я к сожалению использую FireBird (( и на нём такой фокус не проходит((
Ольга (2005-07-09 15:21:00) [18]Для MSSQL это будет так:
select a.dogovor,a.shifr,sum(t_PZ+T_SHT*b.NUM*NUM_DOG)
from main_base a,
(select dogovor,shifr,sum(NUM) as NUM
from main_base
group by dogovor,shifr
having (dogovor="389")
) b
where a.dogovor=b.dogovor and a.shifr=b.shifr
group by a.dogovor, a.shifr
having (dogovor="389")
Russko (2005-07-09 15:17:00) [19]Спасибо большое.
Угадал верно - использую FB, но данный запрос начинает выполняться (не ругается на ошибки в скрипте) и никак не закончится ((( - виснет.
P.N.P. (2005-07-09 14:59:00) [20]Движок-то какой из перечисленных?
В FB например вложенные аггрегатные ф-ции запрещены,
извращаться можно или с пом. хп или вложенным запросом:
select dogovor,shifr,sum(t_PZ+T_SHT*
(
select sum(m2.NUM) from main_base m2
where m2.dogovor = m1.dogovor and m2.shifr = m1.shifr
group by m2.dogovor,m2.shifr having (m2.dogovor="389")
)
*NUM_DOG) from main_base m1
group by 1,2 having (dogovor="389")
ps
писал от руки, не проверяя так что...