Czasami ORA-00907: missing right parenthesis
oznacza dokładnie to:mamy lewy nawias bez pasującego prawego. Ale może to być również spowodowane błędem składni w części instrukcji ograniczonej nawiasami.
To ta druga przyczyna tutaj:LIMIT to polecenie Mysql, którego Oracle nie rozpoznaje. Tutaj możesz użyć funkcji analitycznej:
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
Wykorzystuje funkcję RANK(), która zwróci więcej niż jeden wiersz, jeśli kilku artystów osiągnie ten sam średni zysk. Możesz zamiast tego użyć ROW_NUMBER(). Funkcje analityczne mogą być bardzo potężne. Dowiedz się więcej .
Możesz zastosować ROWN_NUMBER(), RANK() i DENSE_RANK() do dowolnego n problem. Możesz użyć jednego z nich do rozwiązania pierwszego problemu.
To prawdopodobnie problem z danymi. Jeśli jedna z liczb w (salesPrice - AcquisitionPrice)
jest null wynik będzie null i nie zostanie uwzględniony w średniej. Jeśli wszystkie wiersze artysty mają wartość null, funkcja AVG() będzie miała wartość null.
Tak się składa, że kolejność sortowania ustawi NULL na końcu. Ale ponieważ klauzula PARTITION BY sortuje według AvgProfit desc
która umieszcza wyniki NULL na pozycji 1. Rozwiązaniem jest użycie NULLS LAST w klauzuli okienkowej:
, rank() over (order by avgProfit desc nulls last) as rnk
Zagwarantuje to wynik inny niż null na górze (pod warunkiem, że co najmniej jeden z Twoich wykonawców ma wartości w obu kolumnach).