سؤال

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top