Sie müssen die Zeilen 1 und 2 auswählen und dann einen Weg finden, die unerwünschten vorhergehenden Zeilen herauszufiltern – eine Möglichkeit besteht darin, die Aggregation mit einem CASE
zu verwenden Anweisung nur mit der zweiten Zeile übereinstimmen:
Oracle 11g R2-Schema-Setup :
CREATE TABLE mytable ( myvarraycolumn ) AS
SELECT SYS.ODCINUMBERLIST( 1, 2, 3 ) FROM DUAL UNION ALL
SELECT SYS.ODCINUMBERLIST( 4, 5, 6 ) FROM DUAL;
Abfrage 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
| SECOND_ELEMENT |
|----------------|
| 2 |
| 5 |
Es funktioniert nicht, weil:für die erste Zeile in der korrelierten inneren Abfrage ROWNUM
ist 1
und Ihr Filter ist WHERE ROWNUM = 2
dann reduziert sich dies auf WHERE 1=2
und der Filter passt nicht und die Zeile wird verworfen. Die nachfolgende Zeile wird dann gegen eine ROWNUM
getestet von 1
(da die vorherige Zeile nicht mehr in der Ausgabe enthalten ist und keine Zeilennummer hat), die den Test erneut nicht besteht und verworfen wird. Wiederholen, ad nauseum und alle Zeilen scheitern an WHERE
filtern und werden verworfen.