Похоже, что при использовании предложения having
значение count(*)
оценивается до having
, а количество возвращаемых строк оценивается после. Исправление - это, вероятно, подзапросы, но если можно избежать этого, я бы хотел. Я использую count(*)
, чтобы избежать no_data_found
.
Такое поведение встречается в 11.2.0.1.0, 10.2.0.1.0, 9.2.0.7.0, поэтому оно очевидно предназначено, но я не совсем понимаю, почему. Легко воспроизводимый пример приведен ниже.
Кто-нибудь знает, почему это происходит? Я бы ожидал, что count(*)
вернет 1
.
create table tmp_test1 as
select level as id, level as val
from dual
connect by level <= 1000
;
Table created.
create table tmp_test2 as
select level as id, level as val
from dual
connect by level <= 1000
;
Table created.
select count(*) as count
from tmp_test1 a
join tmp_test2 b
on a.id = b.id
having max(a.val) = max(b.val)
;
COUNT
----------
1000
select 1 as num_rows
from tmp_test1 a
join tmp_test2 b
on a.id = b.id
having max(a.val) = max(b.val)
;
NUM_ROWS
----------
1