#sql #oracle
#sql #Oracle
Вопрос:
select s.mname,count(distinct s.actorlist) as act
from p s
group by s.mname
having count(distinct s.actorlist) =
(select max(t.act)
from (
select s1.mname,count(distinct s1.actorlist) as act
from p s1
group by s1.mname
) as t );
ошибка: ORA-00907: отсутствует правая скобка. не удается выполнить запрос
Может кто-нибудь, пожалуйста, помочь мне в обнаружении ошибки.
Ответ №1:
Увы, Oracle не разрешает as
псевдоним таблицы:
select s.mname,count(distinct s.actorlist) as act
from p s
group by s.mname
having count(distinct s.actorlist) =
(select max(t.act)
from (select s1.mname, count(distinct s1.actorlist) as act
from p s1
group by s1.mname
) t
);
Однако обратите внимание: я бы рекомендовал использовать оконные функции для этой цели, а не вложенные подзапросы.
Это будет выглядеть так:
select s.*
from (select s.mname, count(distinct s.actorlist) as act,
max(count(distinct s.actorlist)) over () as max_act
from p s
group by s.mname
) s
where act = max_act;
Комментарии:
1. Привет, не могли бы вы объяснить этот запрос
2. @parthshah . , , Этот вопрос касается синтаксической ошибки, которая, я полагаю, вызвана предложением
as
infrom
. Если у вас есть другой вопрос, вы должны задать его как другой вопрос.
Ответ №2:
Подход к подзапросу можно упростить следующим образом:
select mname, count(distinct actorlist) as act
from p
group by mname
having count(distinct actorlist) = ( select max( count(distinct actorlist) )
from p
group by mname
);
Обратите внимание, как работает подзапрос (в условии НАЛИЧИЯ): он группирует строки в таблице p
по mname
, затем вычисляет различия actorlist
внутри каждой группы, а затем принимает МАКСИМАЛЬНОЕ значение для всех групп (для всех mname
групп).
Я не вижу пользы в использовании псевдонимов здесь ни для таблиц, ни для столбцов. Я также не вижу смысла в псевдонимах таблицы, вызываемой p
на s
— даже если вам нужно полностью указать имена столбцов, p.actorlist
все в порядке. НЕ используя псевдонимы, вы даете понять будущему разработчику, что подзапрос является автономным (он не связан ни с чем во внешнем запросе — он просто вычисляет число автономным образом и возвращает это число в предложение HAVING).
В этом случае я не уверен, что аналитические функции необходимы. (Конечно, ГРУППИРОВКА ПО решению больше не имеет разных уровней вложенных подзапросов, поэтому оснований для рассмотрения аналитических функций больше нет.)
Вы могли бы избежать повторного чтения базовой таблицы с помощью dense_rank last
, но я бы посмотрел на это только в том случае, если производительность низкая; в противном случае это решение выглядит довольно чистым и простым для объяснения и поддержки.