Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie wähle ich gerade Datensätze aus einer Tabelle in Oracle aus?

Es funktioniert nicht, weil:für die erste Zeile ROWNUM ist 1 und in diesem Fall MOD(ROWNUM,2) ist 1 und seit Ihrem WHERE Anweisung ist MOD(ROWNUM,2)=0 dann reduziert sich dies auf 1=0 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), wodurch der Test erneut fehlschlägt und verworfen wird. Wiederholen, bis zum Erbrechen und alle Zeilen scheitern an WHERE testen und werden verworfen.

Wenn Sie versuchen, die ungeraden Zeilen auf diese Weise mit WHERE MOD(ROWNUM,2)=1 zu erhalten dann wird nur die erste Zeile zurückgegeben und die zweite und alle weiteren Zeilen bestehen den Test nicht und werden nie in die Abfrage aufgenommen.

Wie Vijaykumar Hadalgi vorschlägt, müssen Sie die ROWNUM in einer Unterabfrage auswählen (wo sie alle Zeilen ohne eine where-Klausel nummerieren kann, um sie einzuschränken) und dann in der äußeren Abfrage den Test durchführen, um die Zeilen einzuschränken:

SELECT ename, job
FROM   (
  SELECT ename,
         job,
         ROWNUM AS row_id             -- Generate ROWNUM second.
  FROM   (
    SELECT ename, job
    FROM   Emp
    ORDER BY ename                    -- ORDER BY first.
  )
)
WHERE  MOD( row_id, 2 ) = 0;          -- Filter third.

SQLFIDDLE