Někdy ORA-00907: missing right parenthesis
znamená přesně to:máme levou závorku bez odpovídající pravé. Může to ale také způsobit syntaktická chyba v části příkazu ohraničené závorkami.
Zde je druhá příčina:LIMIT je příkaz Mysql, který Oracle nerozpozná. Zde můžete použít analytickou funkci:
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
To používá funkci RANK(), která vrátí více než jeden řádek, pokud několik umělců dosáhne stejného průměrného zisku. Možná budete chtít místo toho použít ROW_NUMBER(). Analytické funkce mohou být velmi výkonné. Další informace .
ROWN_NUMBER(), RANK() a DENSE_RANK() můžete použít na jakýkoli top-n problém. Jeden z nich můžete také použít k vyřešení svého prvního problému.
To je asi problém s daty. Pokud je jedno z čísel v (salesPrice - AcquisitionPrice)
je null, výsledek bude null a nebude zahrnut do průměru. Pokud jsou všechny řádky pro interpreta null, AVG() bude null.
Jak se to stane, pořadí řazení umístí NULL jako poslední. Ale protože klauzule PARTITION BY řadí podle AvgProfit desc
což dává výsledky NULL na 1. pozici. Řešením je použít NULLS LAST v klauzuli pro vytváření oken:
, rank() over (order by avgProfit desc nulls last) as rnk
To vám zaručí nenulový výsledek nahoře (za předpokladu, že alespoň jeden z vašich umělců má hodnoty v obou sloupcích).