Antworten:
Wenn Sie nur eine erste ausgewählte Zeile möchten, können Sie:
select fname from MyTbl where rownum = 1
Sie können auch Analysefunktionen verwenden, um das oberste x zu bestellen und zu übernehmen:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
man ändern kann inWHERE ROWNUM <= X
Mit Oracle 12c (Juni 2013) können Sie es wie folgt verwenden.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
anscheinend nicht notwendig, Sie können verwenden FETCH NEXT 1 ROWS ONLY
oder sogar FETCH FIRST ROW ONLY
, die Reihenfolge nach ist wichtig oder es wird gleichbedeutend sein, nur a zu verwenden WHERE rownum = 1
. Ich habe es sogar in einer OUTER APPLY-Anweisung versucht und es hat dort wie die TOP-Funktion von Ms-SQL funktioniert.
TIES
. Siehe dies für die Fälle , in denen Bindungen auftreten für Version 12c +
und12c -
Sie können ROW_NUMBER()
eine ORDER BY
Klausel in der Unterabfrage verwenden und diese Spalte anstelle von verwenden TOP N
. Dies kann Schritt für Schritt erklärt werden.
Siehe die folgende Tabelle mit zwei Spalten NAME
und DT_CREATED
.
Wenn Sie unabhängig davon nur die ersten beiden Daten verwenden müssen NAME
, können Sie die folgende Abfrage verwenden. Die Logik wurde in die Abfrage geschrieben
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
-- Generates numbers in a column in sequence in the order of date
SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
ERGEBNIS
In einigen Situationen müssen wir die TOP N
jeweiligen Ergebnisse auswählen NAME
. In diesem Fall können wir PARTITION BY
mit einer ORDER BY
Klausel in der Unterabfrage verwenden. Beziehen Sie sich auf die folgende Abfrage.
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
--Generates numbers in a column in sequence in the order of date for each NAME
SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
ERGEBNIS
with (select ... ) as
ändert CTE ( Klausel) nichts an diesem Problem. CTE zielt nur darauf ab, Abfragen zu lesen und zu unterstützen. Richtig? @ Sarath Avanavu
Verwenden:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Wenn Sie Oracle9i + verwenden, können Sie Analysefunktionen wie ROW_NUMBER () verwenden, die jedoch nicht so gut wie ROWNUM funktionieren .
Das Auswählen der ersten Zeile aus einer Tabelle und das Auswählen einer Zeile aus einer Tabelle sind zwei verschiedene Aufgaben und erfordern eine andere Abfrage. Es gibt viele Möglichkeiten, dies zu tun. Vier davon sind:
Zuerst
select max(Fname) from MyTbl;
Zweite
select min(Fname) from MyTbl;
Dritte
select Fname from MyTbl where rownum = 1;
Vierte
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
Ich hatte das gleiche Problem und kann es mit dieser Lösung beheben:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
Sie können Ihr Ergebnis vorher bestellen, um den ersten Wert oben zu haben.
Viel Glück