Soms ORA-00907: missing right parenthesis
betekent precies dat:we hebben een linkerbeugel zonder een bijpassende rechter. Maar het kan ook worden veroorzaakt door een syntaxisfout in een deel van een instructie dat wordt begrensd door haakjes.
Het is die tweede oorzaak hier:LIMIT is een Mysql-commando dat Oracle niet herkent. U kunt hier een analytische functie gebruiken:
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
Dit gebruikt de functie RANK() die meer dan één rij teruggeeft als meerdere artiesten dezelfde gemiddelde winst behalen. Misschien wilt u in plaats daarvan ROW_NUMBER() gebruiken. Analytische functies kunnen zeer krachtig zijn. Meer informatie .
U kunt ROWN_NUMBER(), RANK() en DENSE_RANK() toepassen op elke top-n probleem. Je kunt er ook een gebruiken om je eerste probleem op te lossen.
Dat is waarschijnlijk een dataprobleem. Als een van de cijfers in (salesPrice - AcquisitionPrice)
is null het resultaat is null en wordt niet meegerekend in het gemiddelde. Als alle rijen voor een artiest null zijn, is de AVG() null.
Toevallig zal de sorteervolgorde NULL als laatste plaatsen. Maar aangezien de clausule PARTITION BY sorteert op AvgProfit desc
die de NULL-resultaten op rang 1 plaatst. De oplossing is om de NULLS LAST in de vensterclausule te gebruiken:
, rank() over (order by avgProfit desc nulls last) as rnk
Dit garandeert u een niet-null-resultaat bovenaan (op voorwaarde dat ten minste één van uw artiesten waarden in beide kolommen heeft).