Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.08.20;
Скачать: CL | DM;

Вниз

"Вложенные" вычисления в запросе   Найти похожие ветки 

 
Дмитрий   (2015-03-27 17:13) [0]

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

Для отчетов строю запросы к 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 ...

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

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


 
KilkennyCat ©   (2015-03-27 20:15) [1]


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

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


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

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

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

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

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


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

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


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

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


 
Кщд ©   (2015-03-28 17:27) [5]

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


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

Какой вариант  запросов будет выполняться быстрее
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-31 06:17) [7]

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


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

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


 
KilkennyCat ©   (2015-04-01 12:32) [9]

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

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

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


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

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


 
KilkennyCat ©   (2015-04-01 22:44) [11]

Не знаю.


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


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

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


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

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

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


 
Inovet ©   (2015-04-02 20:11) [14]

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

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


 
KilkennyCat ©   (2015-04-02 22:33) [15]


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

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

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

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


 
Inovet ©   (2015-04-03 14:55) [16]

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


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


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

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


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

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


 
имя   (2015-10-20 19:41) [19]

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



Страницы: 1 вся ветка

Текущий архив: 2017.08.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.005 c
3-1314343082
OW
2011-08-26 11:18
2017.08.20
Oracle.Функция в выборке и в условии - 2 раза будет вычисляться?


2-1425574229
SergP
2015-03-05 19:50
2017.08.20
TiniFile есть ли ограничение на размер ini - файла?


2-1427465606
Дмитрий
2015-03-27 17:13
2017.08.20
"Вложенные" вычисления в запросе


15-1464371531
K-1000
2016-05-27 20:52
2017.08.20
Ваш опен-сорс


2-1427187807
TComboBox
2015-03-24 12:03
2017.08.20
ComboBox DroppedDown direction