Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Вложенные" вычисления в запросе [D7, XP]


Дмитрий ©   (2015-03-27 17:13:00) 

Здравствуйте

Для отчетов строю запросы к mySQL
Много рассчитываемых полей.
Пример,
... Дата1 - ifnull(Дата2, Дата3) as ДлитРасч1...
... Дата4 + ДлитРасч1 as ДатаРасч1 ...
... Дата5 - ДатаРасч1 as ДлитРасч2 ...

Пытался использовать переменные, не получилось, такое использование оказалось не предусмотрено.
... @ДлитРасч1 :=Дата1 - ifnull(Дата2, Дата3) as ДатаРасч1,
  Дата4 + @ДлитРасч1  as ДатаРасч1 ...

Приходится городить запросы к запросам или загромождать повторными вычислениями один запрос.

При необходимости внести изменения получается ужас.
Как делать правильно?


  (2015-10-20 19:41:00) [1]

Удалено модератором


Труп Васи Доброго   (2015-04-23 15:10:00) [2]

А SP не спасёт отца русской демократии? Или в mySQL нет SP?


Германн   (2015-04-04 02:35:00) [3]


> Дмитрий   (02.04.15 18:30) [13]
>
> Причем тут "слабо".
> Вы разве нашли у меня реальные запросы для сравнения?

А разве что-то говорил о "реальных запросах для сравнения"?
Тебе предложили попробовать самому " оценить план запроса и написать простейший скрипт, оценивающий скорость выполнения".


Inovet   (2015-04-03 14:55:00) [4]

А зачем придумали всякие пользовательские функции, в том числе и в SQL? Говорю заранее по требованию автора - не знаю, есть ли они в MySQL, как с ними бороться, и вообще ничего не знаю.


KilkennyCat   (2015-04-02 22:33:00) [5]


> Вы разве нашли у меня реальные запросы для сравнения?
> Или конкретную реализацию функции?

вот именно, что нет. потому что на

> Вопрос был по внутреннему механизму mySQL.
> Будет ли в случае б) вызываться функция повторно, или же
> значение будет сохранено и использовано без повторного расчета

можно ответить так: в некоторых случаях да, а в некоторых нет.


Inovet   (2015-04-02 20:11:00) [6]

> [13] Дмитрий   (02.04.15 18:30)
> без повторного расчета

Ну так тебе и предложили попробовать и проверить. Делов на 1 минуту. Думается, будет там какой-нибудь
Column not found
нет же поля K.


Дмитрий   (2015-04-02 18:30:00) [7]

Причем тут "слабо".
Вы разве нашли у меня реальные запросы для сравнения?
Или конкретную реализацию функции?

Вопрос был по внутреннему механизму mySQL.
Будет ли в случае б) вызываться функция повторно, или же значение будет сохранено и использовано без повторного расчета


Германн   (2015-04-02 02:47:00) [8]


> Дмитрий   (01.04.15 17:01) [10]
>
> не знаете, так бы и сказали
>

На "слабо" пытался развести?


KilkennyCat   (2015-04-01 22:44:00) [9]

Не знаю.


Дмитрий   (2015-04-01 17:01:00) [10]

не знаете, так бы и сказали


KilkennyCat   (2015-04-01 12:32:00) [11]

я тоже хочу избежать двойной работы, давай часть моей рутинной, однообразной,
неинтересной и экспериментальной, а потому с неизвестным результатом, работы ты сделаешь?

> простейший скрипт, оценивающий скорость выполнения?

причем, встроен вроде в майскьюл


Дмитрий   (2015-03-31 21:26:00) [12]

Очень надеялся с вашей помощью избежать выполнения двойной работы
по написанию обоих вариантов запросов
Тем более что их надо до...


Кщд   (2015-03-31 06:17:00) [13]

>Дмитрий   (30.03.15 17:39) [6]
Вы не способны оценить план запроса и написать простейший скрипт, оценивающий скорость выполнения?


Дмитрий   (2015-03-30 17:39:00) [14]

Какой вариант  запросов будет выполняться быстрее
f(field1,field2) - условная хранимая функция
операции с функцией тоже условны, как пример многократного обращения к расчетному значению в одном выражении

а) select ..., (f(field1,field2) - field3)/(f(field1,field2) - field3) ,... from t
или
б) с двухуровневым запросом/вьюхой

... view as q
select id, f(field1,field2) as FF from t
//---------------------------
select id, q.FF , (FF - field3)/(FF + field3)
from t
join q on q.id=t.id


Кщд   (2015-03-28 17:27:00) [15]

>Дмитрий   (27.03.15 20:25) [2]
>Мне с очередной сменой формулы приходится переносить пирамиду вычисляемых полей >на слой глубже.
считать на клиенте
либо смириться с грудой нечитаемого кода (та самая Ваша "пирамида")


кгшзх   (2015-03-28 09:42:00) [16]

select * from (
select ID, 1+1 as K, (K - 1)/(K+1) as K2, ...
from T
)


Дмитрий   (2015-03-27 20:29:00) [17]

Попробую вынести функцию


Дмитрий   (2015-03-27 20:25:00) [18]

Mожно ли каким-то образом задать значение какого-либо поля и тут же его использовать

Select ID, 1+1 as K, (K - 1)/(K+1) as K2, ...
From T

В основном, система ругается на неопознаное поле либо амбигос.
И ладно бы всегда, в некоторых случаях прокатывает.

Мне с очередной сменой формулы приходится переносить пирамиду вычисляемых полей на слой глубже.


KilkennyCat   (2015-03-27 20:15:00) [19]


> Как делать правильно?

смотря как нужно. может, нельзя нагружать сервер, а может можно...
ну а вообще, если возникает запутанность, то надо делать как удобней, чтоб как раз не в падать в ужас при изменениях, т.е. разбивать, оптимизировать, дефайны вводить вовсю.
ну и http://www.zoonman.ru/library/mysql_sr_and_t.htm


Наверх

Титульная страница Поиск, карта сайта Написать письмо