Es fällt mir schwer, gespeicherte Prozeduren von SQL Server auf Oracle zu konvertieren, damit unser Produkt damit kompatibel ist.
Ich habe Abfragen, die den neuesten Datensatz einiger Tabellen basierend auf einem Zeitstempel zurückgeben:
SQL Server:
SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC
=> Damit erhalte ich den neuesten Datensatz
Aber Oracle:
SELECT *
FROM raceway_input_labo
WHERE rownum <= 1
ORDER BY t_stamp DESC
=> Damit erhalte ich den ältesten Datensatz (wahrscheinlich abhängig vom Index), unabhängig von der ORDER BY
Aussage!
Ich habe die Oracle-Abfrage so gekapselt, dass sie meinen Anforderungen entspricht:
SELECT *
FROM
(SELECT *
FROM raceway_input_labo
ORDER BY t_stamp DESC)
WHERE rownum <= 1
und es funktioniert. Aber es klingt für mich nach einem schrecklichen Hack, besonders wenn ich viele Datensätze in den beteiligten Tabellen habe.
Was ist der beste Weg, um dies zu erreichen?
sql
oracle
sql-order-by
rownum
Larry
quelle
quelle
Antworten:
Die
where
Anweisung wird vor dem ausgeführtorder by
. Ihre gewünschte Abfrage lautet also " Nimm die erste Zeile undt_stamp
ordne sie dann nach absteigend ". Und das haben Sie nicht vor.Die Unterabfragemethode ist die richtige Methode, um dies in Oracle zu tun.
Wenn Sie eine Version wünschen, die auf beiden Servern funktioniert, können Sie Folgendes verwenden:
Das Äußere
*
gibt "1" in der letzten Spalte zurück. Sie müssten die Spalten einzeln auflisten, um dies zu vermeiden.quelle
Verwenden Sie
ROW_NUMBER()
stattdessen.ROWNUM
ist eine Pseudospalte undROW_NUMBER()
ist eine Funktion. Sie können den Unterschied zwischen ihnen nachlesen und den Unterschied in der Ausgabe der folgenden Abfragen sehen:quelle
ROWNUM
Es könnte schneller seinROW_NUMBER()
, ob einer über den anderen verwendet werden soll oder nicht, hängt von einer Reihe von Faktoren ab.Eine Alternative, die ich in diesem Anwendungsfall vorschlagen würde, ist die Verwendung von MAX (t_stamp), um die neueste Zeile abzurufen ... z
Meine Codierungsmusterpräferenz (vielleicht) - zuverlässig, im Allgemeinen leistungsfähiger oder besser als der Versuch, die erste Zeile aus einer sortierten Liste auszuwählen - auch die Absicht ist expliziter lesbar.
Hoffe das hilft ...
SQLer
quelle
Dokumentierte einige Designprobleme damit in einem Kommentar oben. Kurz gesagt, in Oracle müssen Sie die Ergebnisse manuell einschränken, wenn Sie große Tabellen und / oder Tabellen mit denselben Spaltennamen haben (und Sie möchten nicht alle explizit eingeben und alle umbenennen). Eine einfache Lösung besteht darin, Ihren Haltepunkt herauszufinden und diesen in Ihrer Abfrage zu begrenzen. Sie können dies auch in der inneren Abfrage tun, wenn Sie nicht die Einschränkung für widersprüchliche Spaltennamen haben. Z.B
wird die Ergebnisse erheblich reduzieren. Dann können Sie ORDER BY oder sogar die äußere Abfrage durchführen, um Zeilen zu begrenzen.
Ich denke auch, dass TOAD eine Funktion zum Begrenzen von Zeilen hat. Ich bin mir jedoch nicht sicher, ob dies die tatsächliche Abfrage unter Oracle einschränkt. Nicht sicher.
quelle