Sql-Abfrage auf rownum
Frage
SELECT instmax
FROM
(SELECT instmax ,rownum r
FROM
( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
WHERE r = 2
);
Nach Ausführung gibt es diese Fehlermeldung:
ORA-00904: "R": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 39 Column: 8
warum gibt es diesen Fehler??
Lösung
Weil Aliase in der Where -Klausel derselben Abfrage nicht unterstützt werden. Schreiben Sie also stattdessen Ihre Anfrage wie:
SELECT instmax
FROM
(SELECT instmax ,rownum r
FROM
( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
) WHERE r = 2;
Andere Tipps
Erste von alle, können Sie nicht in Bezug zu einer zweiten Zeile mit einem rownum = 2
Zustand.Sie können entweder wählen Sie zuerst zwei Zeilen durch Angabe eines where rownum < 3
Zustand, oder Sie können wickeln Sie es in einen anderen Abfrage-und Referenz Ihres rownum
wie eine normale Spalte von drüben.
Dann können Sie nicht auf eine Spalte verweisen alias in einem where
Klausel eine Unterabfrage dieses alias zugewiesen wurde.Sie können entweder bringen Sie eine Ebene höher:
SELECT instmax
FROM (SELECT instmax, rownum r
FROM (SELECT instmax
FROM pswlinstmax
ORDER BY instmax DESC NULLS LAST)
)
WHERE r = 2;
oder einfach nur vermeiden Sie diese Referenz
-- 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
);
Sie können einen Spaltenalias in der Where -Klausel wie diese nicht verweisen.
Das Rownum wird auch nicht auf diese Weise aufgeben. Probieren Sie so etwas aus:
select instmax from
(
SELECT instmax, row_number(instmax) order by (instmax desc nulls last) rownumber
FROM pswlinstmax
)
where rownumber = 2;
@Amit Recht ist.Da Oracle zunächst eine Auswertung der WHERE-Bedingung, und WÄHLEN Sie dann.Sie tun müssen, sub-select.
statt:
SELECT instmax
FROM(
SELECT instmax ,rownum r
FROM (SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST)
WHERE r = 2
);
tun Sie den folgenden:
SELECT instmax
FROM ( SELECT instmax ,rownum r
FROM ( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST )
)
WHERE r = 2
;
...r ist nun sichtbar, der WHERE-Klausel.Vermutlich ist diese Frage identicial/ähnliche/doppelte für diese:
Ein häufiger Weg, um zu bekommen, sagen wir die fünf wichtigsten hochbezahlten Mitarbeiter.
SELECT ename,sal FROM emp
WHERE rownum <= 5
ORDER BY sal DESC;