Ich möchte die Oracle-Syntax verwenden, um nur eine Zeile aus der Tabelle auszuwählen DUAL
. Zum Beispiel möchte ich diese Abfrage ausführen:
SELECT user
FROM DUAL
... und es hätte ungefähr 40 Platten. Aber ich brauche nur eine Platte. ... UND, ich möchte es ohne WHERE
Klausel möglich machen.
Ich brauche etwas im Feld table_name wie:
SELECT FirstRow(user)
FROM DUAL
dual
?dual
ist die Systemtabelle in OracleDUAL
. Es ist ein bisschen wie#define TRUE 0
in C - sicher, es könnte für Sie funktionieren, aber zukünftige Entwickler werden Sie hassen.select user from dual
? Wenn nicht, versuchen Sie es bitte und sehen Sie, was Sie bekommen. Auf einem Standard-Oracle-System erhalten Sie den Benutzer zurück, mit dem Sie den Befehl ausführen.Antworten:
Sie verwenden ROWNUM.
dh.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
quelle
order by
.ORDER BY
wird nach dem angewendetWHERE
.SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
Ich fand diese "Lösung" in einem der Kommentare versteckt. Da ich es eine Weile nachgeschlagen habe, möchte ich es ein wenig hervorheben (kann noch nichts kommentieren oder tun ...), also habe ich Folgendes verwendet:
Dadurch wird der gewünschte Eintrag [Spalte] aus dem neuesten Eintrag in der Tabelle gedruckt, vorausgesetzt, [Datum] wird immer über SYSDATE eingefügt.
quelle
ROWID
, solange Sie keine Datensätze löschen und sich immer um den zuletzt eingefügten / geänderten Datensatz kümmern.ROWID
von Oracle zufällig geändert wird. Ist es nicht. Es basiert darauf, die Zeilen tatsächlich zu ändern, dh Sie löschen eine und fügen dann eine ein. Der eingefügte bekommt den altenROWID
. Es gibt solche Dinge wie statische Tabellen, die niemals aktualisiert werden - wie Staaten in den USA sind ein gutes Beispiel -, wenn es sich ändert, würde es wahrscheinlich sowieso andere Auswirkungen haben, wenn dies in Ordnung ist.ROWID
geändert werden könnten, würde ein guter DBA sie nachschlagen und alles tun, um sie zu vermeiden, wenn die Möglichkeit besteht, dass sie eine solche statische Tabelle beeinflussen, wie ich sie beschrieben habe Nur die Anwendung sollte ausgeführt werden. Ein Tabellenexport kann stattdessen mit einerSELECT
Anweisung durchgeführt werden. Der Import würde einmal und dann nie wieder passieren. Ich verstehe, es ist auf jeden Fall Vorsicht geboten, aber die Probleme sind keineswegs unvermeidlich.Diese Syntax ist in Oracle 12c verfügbar:
^^ Ich wollte nur zeigen, dass entweder Zeile oder Zeilen (Plural) verwendet werden können, unabhängig von der Vielzahl der gewünschten Anzahl von Zeilen.)
quelle
Wir haben drei Möglichkeiten, um die erste Zeile in der Oracle DB-Tabelle abzurufen.
1)
select * from table_name where rownum= 1
ist der beste Weg2)
select * from table_name where id = ( select min(id) from table_name)
3)
quelle
Soweit ich weiß, ist die
dual
Tabelle in Oracle eine spezielle Tabelle mit nur einer Zeile. Das würde also ausreichen:quelle
👌 Die Antwort lautet:
Sie sollten verschachtelte Abfragen verwenden als:
=> In PL / SQL ist "ROWNUM = 1" NICHT gleich "TOP 1" von TSQL.
Sie können eine Abfrage wie diese also nicht verwenden: "Wählen Sie * aus any_table_x aus, wobei rownum = 1 order by any_column_x;" Da Orakel die erste Zeile erhält, wird die Reihenfolge nach Klausel angewendet.
quelle
rownum = 1
, aber wir sollten nicht zulassen, dass alte Fehler unseren Code mehr beeinflussen.limit 1
In Oracle gibt es keine Bedingung (das ist MySQL / PostgresSQL), die Sie angeben müssenwhere rownum = 1
.quelle
"FirstRow" ist eine Einschränkung und daher in der
where
Klausel nicht in derselect
Klausel enthalten. Und es heißt Rownumquelle
ORDER BY
, da die Bestellung erst nach der where-Klausel erfolgt. Mit anderen Worten, um die Spitze einer bestimmten sortierten Abfrage zu erreichen, ist Rownum völlig nutzlos.Where
mit einer View-Abfrage verwenden.SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1
? Nun, das mag funktionieren, aber es sieht ziemlich dumm aus, tbh.Wenn eine Zeile ausreichen würde, versuchen Sie:
Nein wo Klausel.
quelle
quelle
select a.user from (select user from users order by user) a where rownum = 1
wird die beste Leistung bringen, eine andere Option ist:
in Szenarien, in denen Sie verschiedene Teilmengen wollen, aber ich denke, Sie könnten auch verwenden,
RANK()
aber ich mag auch,row_number()
over(...)
da keine Gruppierung erforderlich ist.quelle
Wenn Sie nur die erste Zeile eines sortierten Ergebnisses mit den geringsten Unterabfragen zurückholen möchten, versuchen Sie Folgendes:
quelle
Flexibler als es
select max()
ist:quelle