Nogle gange ORA-00907: missing right parenthesis
betyder præcis det:vi har en venstre beslag uden en matchende højre. Men det kan også forårsages af en syntaksfejl i en del af en sætning afgrænset af parenteser.
Det er den anden årsag her:LIMIT er en Mysql-kommando, som Oracle ikke genkender. Du kan bruge en analytisk funktion her:
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
Dette bruger RANK()-funktionen, som vil returnere mere end én række, hvis flere kunstnere opnår den samme gennemsnitlige fortjeneste. Du vil måske bruge ROW_NUMBER() i stedet. Analytiske funktioner kan være meget kraftfulde. Få mere at vide .
Du kan anvende ROWN_NUMBER(), RANK() og DENSE_RANK() til enhver top-n problem. Du kan også bruge en af dem til at løse dit første problem.
Det er nok et dataproblem. Hvis et af tallene i (salesPrice - AcquisitionPrice)
er null, vil resultatet være null og vil ikke blive inkluderet i gennemsnittet. Hvis alle rækkerne for en kunstner er null, vil AVG() være null.
Som det sker, vil sorteringsrækkefølgen sætte NULL sidst. Men da PARTITION BY-sætningen sorterer efter AvgProfit desc
der placerer NULL-resultaterne i rang 1. Løsningen er at bruge NULLS LAST i vinduesklausulen:
, rank() over (order by avgProfit desc nulls last) as rnk
Dette vil garantere dig et ikke-nul resultat øverst (forudsat at mindst én af dine kunstnere har værdier i begge kolonner).