कभी-कभी ORA-00907: missing right parenthesis
इसका मतलब ठीक यही है:हमारे पास एक मिलान करने वाला दायां ब्रैकेट है। लेकिन इसे एक वाक्य रचना त्रुटि द्वारा कोष्ठक से बंधे हुए कथन के एक भाग में भी फेंका जा सकता है।
यह यहाँ दूसरा कारण है:LIMIT एक Mysql कमांड है जिसे Oracle नहीं पहचानता है। आप यहां विश्लेषणात्मक फ़ंक्शन का उपयोग कर सकते हैं:
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
यह रैंक () फ़ंक्शन का उपयोग करता है जो एक से अधिक पंक्तियों को वापस कर देगा यदि कई कलाकार समान औसत लाभ प्राप्त करते हैं। आप इसके बजाय ROW_NUMBER() का उपयोग करना चाह सकते हैं। विश्लेषणात्मक कार्य बहुत शक्तिशाली हो सकते हैं। और जानें ।
आप किसी भी शीर्ष-n पर ROWN_NUMBER(), RANK() और DENSE_RANK() लागू कर सकते हैं संकट। आप उनमें से किसी एक का उपयोग अपनी पहली समस्या को हल करने के लिए भी कर सकते हैं।
यह शायद एक डेटा मुद्दा है। अगर (salesPrice - AcquisitionPrice)
. में से कोई एक नंबर शून्य है, परिणाम शून्य होगा, और औसत में शामिल नहीं किया जाएगा। यदि किसी कलाकार के लिए सभी पंक्तियाँ शून्य हैं, तो AVG () शून्य होगी।
जैसा कि होता है सॉर्ट ऑर्डर NULL को अंतिम रूप देगा। लेकिन जैसा कि पार्टिशन बाय क्लॉज AvgProfit desc
के अनुसार सॉर्ट करता है जो NULL परिणामों को रैंक 1 पर रखता है। समाधान विंडोिंग क्लॉज में NULLS LAST का उपयोग करना है:
, rank() over (order by avgProfit desc nulls last) as rnk
यह आपको शीर्ष पर एक गैर-शून्य परिणाम की गारंटी देगा (बशर्ते आपके कम से कम एक कलाकार के दोनों कॉलम में मान हों)।