Понякога ORA-00907: missing right parenthesis
означава точно това:имаме лява скоба без съответстваща дясна. Но може също да бъде предизвикано от синтактична грешка в част от израз, ограничен със скоби.
Това е втората причина тук:LIMIT е команда на Mysql, която Oracle не разпознава. Тук можете да използвате аналитична функция:
SELECT A1.artistid, A1.firstname, TEMP1.avgProfit
FROM
(
select artistid
, avgProfit
, rank() over (order by avgProfit desc) as rnk
from (
SELECT
AVG(salesPrice - AcquisitionPrice) as avgProfit,
W1.artistid as artistid
FROM dtoohey.trans T1
INNER JOIN dtoohey.WORK W1
ON W1.workid = T1.workid
GROUP BY artistid
)
) TEMP1
INNER JOIN dtoohey.artist A1
ON A1.artisid = TEMP1.artistid
where TEMP1.rnk = 1
Това използва функцията RANK(), която ще върне повече от един ред, ако няколко изпълнители постигнат една и съща средна печалба. Вместо това може да искате да използвате ROW_NUMBER(). Аналитичните функции могат да бъдат много мощни. Научете повече .
Можете да приложите ROWN_NUMBER(), RANK() и DENSE_RANK() към всеки топn проблем. Можете да използвате един от тях, за да разрешите и първия си проблем.
Това вероятно е проблем с данните. Ако едно от числата в (salesPrice - AcquisitionPrice)
е нула, резултатът ще бъде нулев и няма да бъде включен в средната стойност. Ако всички редове за даден изпълнител са null, AVG() ще бъде null.
Както се случва, редът на сортиране ще постави NULL последно. Но тъй като клаузата PARTITION BY сортира по AvgProfit desc
което поставя резултатите NULL на ранг 1. Решението е да използвате NULLS LAST в клаузата за прозорци:
, rank() over (order by avgProfit desc nulls last) as rnk
Това ще ви гарантира ненулев резултат в горната част (при условие, че поне един от вашите изпълнители има стойности и в двете колони).