На самом деле это работает.Это просто не работает так, как вы думаете.Всегда возвращать результат - документированное поведение для агрегирующих функций .
SQL> select ts from t23;
TS
---------
25-APR-11
26-APR-11
SQL> select max(ts) from t23
2 /
MAX(TS)
---------
26-APR-11
SQL> delete from t23
2 /
2 rows deleted.
SQL> select max(ts) from t23
2 /
MAX(TS)
---------
SQL>
Однако, если вы действительно хотите пустой набор и обрабатываете его соответствующим образом, вам придется сделать что-то вроде этого:
SQL> select max_ts from
2 ( select max(ts) as max_ts from t23 )
3 where max_ts is not null
4 /
no rows selected
SQL>
Хм, решение Quassnoi точнее (меньше набирает):
SQL> select max(ts) from t23
2 having count(*) > 0
3 /
no rows selected
SQL>
Как указывает Quassnoi, мое решение вернет пустой набор, даже если в таблице есть строкипри условии, что ни один экземпляр столбца TS не заполнен.Решение Q вернуло бы строку с нулевым результатом при тех же обстоятельствах.От бизнес-требований зависит, какой из результатов является правильным.