इस तथ्य के अलावा कि आप जॉइन के लिए पुराने निहित अल्पविराम सिंटैक्स का उपयोग कर रहे हैं, आप उप क्वेरी में गलत तरीके से टेबल के कॉलम भी जोड़ रहे हैं।
subject_name
subject
. का एक कॉलम है जिसका छात्र के अंकों से संबंध से कोई लेना-देना नहीं है। तो, उच्चतम अंक वाले छात्र_आईडी का निर्धारण करते समय अंक को विषय के साथ अलग से जोड़ा जा सकता है। फिर हम उन student_ids का उपयोग करके छात्र का नाम प्राप्त कर सकते हैं
तो, Oracle 12c और इसके बाद के संस्करण में, आप कर सकते हैं
SELECT s.student_name
FROM student s
WHERE s.student_id IN ( SELECT m.student_id
FROM mark m JOIN subject su
ON su.subject_id = m.subject_id
WHERE lower(su.subject_name) = 'software engineering'
ORDER BY m.value DESC
FETCH FIRST 1 ROWS WITH TIES ) order by 1;
पिछले संस्करणों के लिए, आप dense_rank
. का उपयोग कर सकते हैं या rank
SELECT s.student_name
FROM student s
WHERE s.student_id IN ( SELECT student_id
FROM ( SELECT m.*,DENSE_RANK() OVER(
ORDER BY m.value DESC
) AS rnk
FROM mark m JOIN subject su
ON su.subject_id = m.subject_id
WHERE lower(su.subject_name) = 'software engineering'
) WHERE rnk = 1
) order by 1;