A volte ORA-00907: missing right parenthesis
significa esattamente questo:abbiamo una parentesi sinistra senza una destra corrispondente. Ma può anche essere generato da un errore di sintassi in una parte di un'istruzione delimitata da parentesi.
È la seconda causa qui:LIMIT è un comando Mysql che Oracle non riconosce. Puoi usare una funzione analitica qui:
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
Questo utilizza la funzione RANK() che restituirà più di una riga se più artisti ottengono lo stesso profitto medio. Potresti invece utilizzare ROW_NUMBER(). Le funzioni analitiche possono essere molto potenti. Scopri di più .
Puoi applicare ROWN_NUMBER(), RANK() e DENSE_RANK() a qualsiasi top-n problema. Puoi usarne uno anche per risolvere il tuo primo problema.
Probabilmente è un problema di dati. Se uno dei numeri in (salesPrice - AcquisitionPrice)
è nullo il risultato sarà nullo e non sarà incluso nella media. Se tutte le righe per un artista sono nulle, AVG() sarà nullo.
Come succede, l'ordinamento metterà NULL per ultimo. Ma poiché la clausola PARTITION BY ordina per AvgProfit desc
che mette i risultati NULL al rango 1. La soluzione è usare NULLS LAST nella clausola windowing:
, rank() over (order by avgProfit desc nulls last) as rnk
Questo ti garantirà un risultato non nullo in alto (ammesso che almeno uno dei tuoi artisti abbia valori in entrambe le colonne).