Đôi khi ORA-00907: missing right parenthesis
có nghĩa chính xác rằng:chúng ta có một dấu ngoặc vuông bên trái mà không có một dấu ngoặc vuông phù hợp bên phải. Nhưng nó cũng có thể bị lỗi cú pháp trong một phần của câu lệnh được giới hạn bởi dấu ngoặc đơn.
Đó là nguyên nhân thứ hai ở đây:LIMIT là lệnh Mysql mà Oracle không nhận ra. Bạn có thể sử dụng một hàm phân tích tại đây:
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
Điều này sử dụng hàm RANK () sẽ trả về nhiều hơn một hàng nếu một số nghệ sĩ đạt được lợi nhuận trung bình như nhau. Bạn có thể muốn sử dụng ROW_NUMBER () thay thế. Các chức năng phân tích có thể rất mạnh mẽ. Tìm hiểu thêm .
Bạn có thể áp dụng ROWN_NUMBER (), RANK () và DENSE_RANK () cho bất kỳ đầu- n vấn đề. Bạn cũng có thể sử dụng một trong số chúng để giải quyết vấn đề đầu tiên của mình.
Đó có lẽ là một vấn đề dữ liệu. Nếu một trong các số trong (salesPrice - AcquisitionPrice)
là null, kết quả sẽ là null và sẽ không được tính vào giá trị trung bình. Nếu tất cả các hàng của một nghệ sĩ là rỗng thì AVG () sẽ là rỗng.
Khi nó xảy ra, thứ tự sắp xếp sẽ đặt NULL cuối cùng. Nhưng vì mệnh đề PARTITION BY được sắp xếp theo AvgProfit desc
điều đó đặt kết quả NULL ở thứ hạng 1. Giải pháp là sử dụng NULLS LAST trong mệnh đề cửa sổ:
, rank() over (order by avgProfit desc nulls last) as rnk
Điều này sẽ đảm bảo cho bạn một kết quả không rỗng ở trên cùng (cung cấp ít nhất một trong các nghệ sĩ của bạn có giá trị trong cả hai cột).