И еще добавление в развитие темы.
Еще до выдачи результатов запроса, но после разбора sql выражения, sql-интерпретатор (компилятор? сервер?) уже знает количество выдаваемых полей, их типы и имена. Кроме того он должен подготовить необходимые переменные/структуры для выдачи/хранения (промежуточных) результатов.
Значит в запросе:
Код: Выделить всё
select ..., min(l.vtime) as MINVTIME, (
select ... from lines l2
where ... l2.vtime = min(l.vtime)
)
from lines l
он выделит переменную/структуру и под MINVTIME.
Поскольку невозможно построить JOIN по min(..), во внутреннем селекте будет не JOIN, а именно сравнение. И к моменту сравнения значение min(l.vtime) должно быть уже известно. Вопрос когда это значение будет вычислено остается на совести интерпретатора. Если он тупой, то будет вычислять и во внутреннем селекте. А если умный, то поймет ли, что, к примеру, в:
Код: Выделить всё
select ..., min(l.vtime) + 1 as MINVTIME, (
select ... from lines l2
where ... l2.vtime = min(l.vtime) + 5 /*или даже min(l.vtime) + 1 + 4*/
)
from lines l
min(l.vtime) + 5 = (min(l.vtime) + 1) + 4
и можно не вычислять min(..) по множеству записей, а взять min() из внешнего селекта и прибавить к нему 4? (пример можно придумать посложней и пореалистичней).
Но, вернемся к первому примеру. Итак, min(...) вычислен, его значение (скажем = 5) можно смело записывать в соответствующую внутреннюю переменную как текущее значение выходного поля MINVTIME. Т.к. текущее значение этого поля не изменится ни при каких обстоятельствах. Возможно по каким либо причинам (distinct, having) сервер и не выдаст
всей строки, или выдаст строки в другом порядке. Но именно для этой строки MINVTIME будет равно именно 5, а не 10, 15, 128.
А раз известно
имя поля, его тип и
значение, то почему бы не разрешить использовать
значение этого поля в выражениях, сравнениях и т.д.? И обращаться к нему по имени, как и к любому другому полю.
Причем агрегаты - это только частный случай. Можно было бы строить и выражения аля:
select TABLE.FIELD1,
(select ... ну очень крутой запрос ...) as FIELD2,
FIELD2 / 100,
FIELD2 + (select ...),
(select ... еще круче запрос...
where T3.HZ = FIELD2 + 5
)
from ...
group by FIELD2,
order by FIELD2,
having FIELD2 > 100;
Имея возможность строить такие запросы отпала бы надобность в части процедур. Тем более, что процедуру нужно помещать в базу, а запрос можно выполнить и на клиенте!
Мечты, мечты...