استعلام SQL على Rownum
سؤال
SELECT instmax
FROM
(SELECT instmax ,rownum r
FROM
( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
WHERE r = 2
);
بعد التنفيذ ، يعطي هذا الخطأ:
ORA-00904: "R": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 39 Column: 8
لماذا تعطي هذا الخطأ ؟؟
المحلول
لأن الأسماء المستعارة غير مدعومة في شرط WHERE من نفس الاستعلام. لذا ، اكتب استفسارك مثل:
SELECT instmax
FROM
(SELECT instmax ,rownum r
FROM
( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
) WHERE r = 2;
نصائح أخرى
بادئ ذي بدء ، لا يمكنك الإشارة إلى الصف الثاني باستخدام أ rownum = 2
حالة. يمكنك إما تحديد أول صفين عن طريق تحديد أ where rownum < 3
الشرط ، أو يمكنك لفه في استعلام آخر والرجوع rownum
كعمود عادي من هناك.
بعد ذلك ، لا يمكنك الرجوع إلى الاسم المستعار في العمود في أ where
بند مسمة فرعية تم تعيين هذا الاسم المستعار. يمكنك إما رفعه مستوى واحد:
SELECT instmax
FROM (SELECT instmax, rownum r
FROM (SELECT instmax
FROM pswlinstmax
ORDER BY instmax DESC NULLS LAST)
)
WHERE r = 2;
أو فقط تجنب هذا المرجع
-- this will return first two rows
SELECT instmax
FROM (SELECT instmax, rownum r
FROM (SELECT instmax
FROM pswlinstmax
ORDER BY instmax DESC NULLS LAST)
WHERE rownum < 3
);
لا يمكنك الرجوع إلى اسم مستعار للعمود في جملة WHERE من هذا القبيل.
لن يتوقف رونوم عن العمل بهذه الطريقة أيضًا. جرب شيئًا كهذا:
select instmax from
(
SELECT instmax, row_number(instmax) order by (instmax desc nulls last) rownumber
FROM pswlinstmax
)
where rownumber = 2;
amit على حق. لأن Oracle يقوم أولاً بتقييم حالة أين ، ثم حدد. عليك أن تفعل sub-select.
بدلاً من:
SELECT instmax
FROM(
SELECT instmax ,rownum r
FROM (SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST)
WHERE r = 2
);
افعل ما يلي:
SELECT instmax
FROM ( SELECT instmax ,rownum r
FROM ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST )
)
WHERE r = 2
;
... R الآن مرئي للفقرة Where. من الناحية الإشارة ، فإن هذا السؤال متماثل/مشابه/مكرر لهذا:
هناك طريقة شائعة للحصول على الموظفين الخمسة الأجر.
SELECT ename,sal FROM emp
WHERE rownum <= 5
ORDER BY sal DESC;