Похоже, что при использовании предложения having
a 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
В чем вопрос? Это абсолютно разумное и ожидаемое поведение для любой системы баз данных (с использованием SQL)! – Mithrandir
@Ben - что вы ожидали, что он вернется? –
@ Митрандир, не так ли? Я никогда не сталкивался с этим раньше ... Почему мой вопрос? Количество возвращаемых строк ясно указывает, что предложение having оценивается, но я не понимаю, почему счет оценивается ранее. – Ben