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??

War es hilfreich?

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:

Verwendung eines Alias in WHERE-Klausel

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top