requête sql sur rownum
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 ??
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:
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;