Question

SELECT instmax
FROM
  (SELECT instmax ,rownum r
  FROM
    ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
    )
  WHERE r = 2
  );

Après l'exécution, il est donner cette erreur:

ORA-00904: "R": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 39 Column: 8

pourquoi il donne cette erreur ??

Était-ce utile?

La solution

Parce que les alias ne sont pas pris en charge dans la clause WHERE de la même requête. Ainsi, au lieu d'écrire votre requête comme:

SELECT instmax
FROM 
  (SELECT instmax ,rownum r 
  FROM 
    ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST 
    )  
) WHERE r = 2;

Autres conseils

Tout d'abord, vous ne pouvez pas faire référence à une deuxième ligne en utilisant une condition de rownum = 2. Vous pouvez sélectionner deux premières lignes en spécifiant une condition de where rownum < 3, ou vous pouvez l'envelopper dans une autre requête et référencer vos rownum comme une colonne ordinaire de là-bas.

Ensuite, vous ne pouvez pas faire référence à un alias de colonne dans une clause de where d'un sous-requête cet alias a été attribué. Vous pouvez apporter soit il un niveau supérieur:

SELECT instmax
  FROM (SELECT instmax, rownum r
          FROM (SELECT instmax
                  FROM pswlinstmax
                 ORDER BY instmax DESC NULLS LAST)
         )
         WHERE r = 2;

ou tout simplement éviter cette référence

-- 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
         );

Vous ne pouvez pas référencer un alias de colonne dans la clause where comme ça.

Le rownum ne quittera pas le travail de cette façon non plus. Essayez quelque chose comme ceci:

select instmax from
(
  SELECT instmax, row_number(instmax) order by (instmax desc nulls last) rownumber
  FROM pswlinstmax
)
where rownumber = 2;

@Amit est juste. Comme Oracle évalue d'abord la condition WHERE, puis SELECT. Vous devez faire sous-sélectionner.

au lieu de:

SELECT instmax
FROM(
  SELECT instmax ,rownum r
  FROM (SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST)
  WHERE r = 2
  );

procédez comme suit:

SELECT instmax
FROM ( SELECT instmax ,rownum r
       FROM ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST )
)
WHERE r = 2
;

... r est maintenant visible à la clause WHERE. Propably cette question est identicial / similaire / dupliquer pour cela:

utilisant un alias dans une clause WHERE

Une façon courante de se permet de dire que les cinq employés hautement rémunérés.

SELECT ename,sal FROM   emp
WHERE  rownum <= 5
ORDER BY sal DESC;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top