Musisz wybrać wiersze 1 i 2, a następnie wypracować sposób na odfiltrowanie niechcianych wierszy poprzedzających - jednym ze sposobów jest użycie agregacji z CASE
oświadczenie pasujące tylko do drugiego wiersza:
Konfiguracja schematu Oracle 11g R2 :
CREATE TABLE mytable ( myvarraycolumn ) AS
SELECT SYS.ODCINUMBERLIST( 1, 2, 3 ) FROM DUAL UNION ALL
SELECT SYS.ODCINUMBERLIST( 4, 5, 6 ) FROM DUAL;
Zapytanie 1 :
SELECT (
SELECT MAX( CASE ROWNUM WHEN 2 THEN COLUMN_VALUE END )
FROM TABLE( t.myvarraycolumn )
WHERE ROWNUM <= 2
) AS second_element
FROM mytable t
Wyniki :
| SECOND_ELEMENT |
|----------------|
| 2 |
| 5 |
Nie działa, ponieważ:w pierwszym wierszu w skorelowanym zapytaniu wewnętrznym ROWNUM
to 1
a Twój filtr to WHERE ROWNUM = 2
to zmniejsza się do WHERE 1=2
a filtr nie jest dopasowany, a wiersz jest odrzucany. Kolejny wiersz zostanie następnie przetestowany pod kątem ROWNUM
z 1
(ponieważ poprzedni wiersz nie jest już w danych wyjściowych i nie będzie miał numeru wiersza), który ponownie nie przejdzie testu i zostanie odrzucony. Powtarzam, ad znudzenie i wszystkie wiersze kończą się niepowodzeniem WHERE
filtrować i są odrzucane.