Terkadang ORA-00907: missing right parenthesis
artinya persis seperti itu:kami memiliki braket kiri tanpa braket kanan yang cocok. Tapi itu juga bisa dilempar oleh kesalahan sintaks di bagian pernyataan yang dibatasi oleh tanda kurung.
Penyebab kedua di sini:LIMIT adalah perintah Mysql yang tidak dikenali Oracle. Anda dapat menggunakan fungsi analitik di sini:
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
Ini menggunakan fungsi RANK() yang akan mengembalikan lebih dari satu baris jika beberapa artis mencapai keuntungan rata-rata yang sama. Anda mungkin ingin menggunakan ROW_NUMBER() sebagai gantinya. Fungsi analitik bisa sangat kuat. Cari tahu lebih lanjut .
Anda dapat menerapkan ROWN_NUMBER(), RANK() dan DENSE_RANK() ke atas-n mana saja masalah. Anda dapat menggunakan salah satunya untuk menyelesaikan masalah pertama Anda juga.
Itu mungkin masalah data. Jika salah satu nomor di (salesPrice - AcquisitionPrice)
adalah null hasilnya akan menjadi null, dan tidak akan dimasukkan dalam rata-rata. Jika semua baris untuk artis adalah nol, AVG() akan menjadi nol.
Ketika itu terjadi, urutan pengurutan akan membuat NULL menjadi yang terakhir. Tetapi karena klausa PARTITION BY mengurutkan berdasarkan AvgProfit desc
yang menempatkan hasil NULL pada peringkat 1. Solusinya adalah dengan menggunakan NULLS LAST pada klausa windowing:
, rank() over (order by avgProfit desc nulls last) as rnk
Ini akan menjamin Anda hasil non-null di bagian atas (asalkan setidaknya satu artis Anda memiliki nilai di kedua kolom).