Wie wähle ich die n-te Zeile in einer SQL-Datenbanktabelle?
Ich bin interessiert in das erlernen der (im Idealfall) eine Datenbank-unabhängige Wege bei der Auswahl der nTEN Zeile aus einer Datenbank-Tabelle. Es wäre auch interessant zu sehen, wie dies erreicht werden kann, mithilfe der systemeigenen Funktionalität der folgenden Datenbanken:
- SQL Server
- MySQL
- PostgreSQL
- SQLite
- Oracle
Ich bin derzeit dabei so etwas wie die folgenden in der SQL Server 2005 -, aber ich wäre daran interessiert, dass andere mehr agnostische Ansätze:
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
Kredit für die obige SQL: Firoz Ansari ' s Weblog
Update: Sehen Troels Arvin Antwort in Bezug auf den SQL standard. Troels, hast du irgendwelche links, die wir zitieren?
InformationsquelleAutor der Frage Charles Roper | 2008-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es Möglichkeiten, dies zu tun, in optionalen Teile der standard, aber viele Datenbanken unterstützen, Ihren eigenen Weg, es zu tun.
Eine wirklich gute Website, die Gespräche über diese und andere Dinge ist http://troels.arvin.dk/db/rdbms/#select-limit.
Grundsätzlich, PostgreSQL und MySQL unterstützt die non-standard:
Oracle, DB2 und MSSQL unterstützt die standard-Window-Funktionen:
(die ich nur kopiert von der Website oben verlinkten, da ich nie verwenden Sie diese DBs)
Update: Als von PostgreSQL 8.4 das standard windowing-Funktionen unterstützt werden, so erwarten das zweite Beispiel funktioniert für PostgreSQL als gut.
InformationsquelleAutor der Antwort Henrik Gustafsson
Den
LIMIT
/OFFSET
- syntax in PostgreSQL ist:Diesem Beispiel wählt der 21ten Zeile.
OFFSET 20
sagt Postgres zu überspringen, die ersten 20 Datensätze. Wenn Sie nicht angeben, eineORDER BY
- Klausel, es gibt keine Garantie, die Platte erhalten Sie zurück, das wird selten nützlich.Anscheinend ist der SQL-standard ist still auf der Grenze-Problem außerhalb der crazy-Window-Funktionen, die ist, warum jeder setzt es anders.
InformationsquelleAutor der Antwort Neall
Ich bin mir nicht sicher über den rest, aber ich weiß, SQLite und MySQL habe keine "default" - Zeile der Bestellung. In diesen beiden Dialekten, zumindest der folgende Abschnitt greift die 15 Eintrag vom the_table, Sortierung nach Datum/Zeit, zu der es Hinzugefügt wurde:
(natürlich, würden Sie brauchen, um zu haben ein zusätzliches DATETIME-Feld, und legen Sie es auf das Datum/die Zeit, dass der Eintrag Hinzugefügt wurde...)
InformationsquelleAutor der Antwort Ellen Teapot
SQL 2005 und höher ist diese Funktion eingebaut. Die Verwendung der ROW_NUMBER() Funktion. Es eignet sich hervorragend für web-Seiten mit einem << Prev und Next >> Stil durchsuchen:
Syntax:
InformationsquelleAutor der Antwort Ben Breen
Ich vermute, das ist völlig ineffizient, aber ist eine Recht einfache Ansatz, der arbeitete auf einem kleinen Datensatz, dass ich versuchte es auf.
Dies würde zu erhalten, das 5. Element, ändern Sie die zweite top-Nummer zu bekommen, eine andere N-te Element
Nur SQL-server (glaube ich), aber sollte funktionieren auf älteren Versionen nicht unterstützen ROW_NUMBER().
InformationsquelleAutor der Antwort Tim Saunders
1 kleine änderung: n-1 statt n.
InformationsquelleAutor der Antwort Nick Berardi
Überprüfen, ob es auf dem SQL Server:
Dies wird Ihnen 10ten ZEILE der Tabelle emp!
InformationsquelleAutor der Antwort Rameshwar Pawale
Im Gegensatz zu dem, was einige der Antworten, die behaupten, der SQL-standard ist nicht schweigen zu diesem Thema.
Seit SQL:2003 haben Sie in der Lage gewesen, "Fenster-Funktionen" überspringen von Zeilen und einschränken von Resultsets.
Und in SQL:2008, einen etwas einfacheren Ansatz Hinzugefügt worden, mit
OFFSET skip ROWS
FETCH FIRST n ROWS ONLY
Persönlich, ich glaube nicht, dass SQL:2008 ist zusätzlich war auch wirklich gebraucht werden, also wenn ich ISO, ich würde gehalten haben, aus einer bereits ziemlich großen standard.
InformationsquelleAutor der Antwort Troels Arvin
Oracle:
InformationsquelleAutor der Antwort Mark Harrison
Wenn wir verwendet, um die Arbeit in MSSQL 2000, haben wir das, was wir als den "dreifach-flip":
BEARBEITET
Es war nicht elegant, und es war nicht schnell, aber es funktionierte.
InformationsquelleAutor der Antwort Adam V
Select n' th-Eintrag von oben
select n' th-Eintrag von unten
InformationsquelleAutor der Antwort Aditya
Hier ist eine schnelle Lösung für Ihre Verwirrung.
Hier können Sie bekommen, Letzte Zeile Ausfüllen N=0, vorletzte, die durch N=1, Vierte Zuletzt Durch das Ausfüllen N=3 und so weiter.
Dies ist eine sehr Allgemeine Frage über das interview und dies ist Sehr einfach ans.
Weiter, Wenn Sie möchten, Betrag, ID oder einige Numerische Sortierung als u gehen können, für die CAST-Funktion in MySQL.
Hier Durch das ausfüllen von N = 4 werden Sie in der Lage zu bekommen, Fünften, Letzten Datensatz der Höchste Betrag aus dem WARENKORB Tabelle. Sie können passen Sie Ihre Feld-und Tabellennamen und kommen mit der Lösung.
InformationsquelleAutor der Antwort Amit Shah
HINZUFÜGEN:
Beschränken Sie die Ergebnisse auf ein Ergebnis ab Folge n.
InformationsquelleAutor der Antwort Andrew G. Johnson
LIMIT n,1 funktioniert nicht im MS SQL Server. Ich denke, es ist nur über die einzige große Datenbank, die nicht unterstützen diese syntax. Um fair zu sein, es ist nicht Teil des SQL-Standards, obwohl, es ist so weit unterstützt, dass es sein sollte. In alles außer SQL server LIMIT Super funktioniert. Für SQL server, ich habe nicht in der Lage zu finden, eine elegante Lösung.
InformationsquelleAutor der Antwort Kibbee
Hier ist eine generische version von einem sproc ich schrieb vor kurzem für Oracle, der es ermöglicht, dynamische paging/sorting - HTH
InformationsquelleAutor der Antwort Greg Hurlman
Aber wirklich, ist das alles nicht wirklich nur parlor tricks für gute Datenbank-design in Erster Linie? Die wenigen Male, die ich benötigte Funktionalität, wie dieser es war für einen einfachen ein-aus-Abfrage, um einen schnellen Bericht. Für echte Arbeit, mit tricks wie diesen ist Einladend Schwierigkeiten. Wenn die Auswahl einer bestimmten Zeile benötigt wird dann nur noch eine Spalte mit einer fortlaufenden Wert-und mit ihm getan werden.
InformationsquelleAutor der Antwort
Zum Beispiel, wenn Sie möchten, wählen Sie jede 10te Zeile in MSSQL, die Sie verwenden können;
Nimm einfach die MOD, und ändern Sie die Zahl 10 hier jede Zahl, die Sie wollen.
InformationsquelleAutor der Antwort E-A
In Sybase SQL Anywhere:
Vergessen Sie nicht, die BESTELLUNG DURCH oder es ist sinnlos.
InformationsquelleAutor der Antwort Graeme Perrow
For SQL Server ist ein generischer Weg zu gehen, der durch Zeilen-Nummer ist wie folgt:
SET ROWCOUNT @Zeile --@Zeile = die Nummer der Zeile, die Sie Bearbeiten möchten.
Beispiel:
set rowcount-20-stellt die Zeile 20 Zeile
wählen Sie Fleisch, Käse aus der dbo.sandwich-wählen Sie Spalten aus der Tabelle bei Zeile 20
set rowcount 0 --setzt rowcount zurück, um alle Zeilen
Diese Rückkehr der 20sten Zeile Informationen. Geben Sie in den rowcount 0 hinterher.
Ich weiß noobish, aber ich bin ein SQL noob und ich habe es verwendet, so was kann ich sagen?
InformationsquelleAutor der Antwort
T-SQL - Auswahl der N ' te RecordNumber aus einer Tabelle
Z.B. auswählen 5. Datensatz aus der Tabelle Mitarbeiter, Ihre Abfrage sollte
InformationsquelleAutor der Antwort Sangeeth Krishna
InformationsquelleAutor der Antwort
Ich geschrieben habe, diese Abfrage für die Suche nach dem N-TEN Zeile.
Beispiel mit dieser Abfrage wäre
InformationsquelleAutor der Antwort Arjun Chiddarwar
unglaublich, finden Sie eine SQL-engine, die die Ausführung ...
InformationsquelleAutor der Antwort jrEving
Nichts besonderes, keine besonderen Funktionen, im Falle der Verwendung Caché wie ich das mache...
Gegeben, dass Sie eine ID-Spalte oder eine Zeitstempel-Spalte, der Sie Vertrauen können.
InformationsquelleAutor der Antwort Scott Beeson
Dies ist, wie ich es tun würde, innerhalb von DB2-SQL, ich glaube, das RRN (relative record number) ist gespeichert in der Tabelle durch die O/S;
InformationsquelleAutor der Antwort RDKells
Wählen Sie zunächst die top 100 Zeilen durch die Anordnung in aufsteigender und dann wählen Sie die Letzte Zeile durch die Bestellung in absteigend und limit auf 1. Dies ist jedoch eine sehr teure Aussage, wie der Zugriff auf die Daten zweimal.
InformationsquelleAutor der Antwort Dwipam Katariya
Scheint es mir, dass, um effizient zu sein, müssen Sie 1) eine Zufallszahl erzeugen zwischen 0 und eins kleiner als die Anzahl der Datenbank-Datensätze, und 2) in der Lage sein, um die Zeile auszuwählen, die an dieser position. Leider, verschiedene Datenbanken verschiedene Zufallszahlen-Generatoren und verschiedene Möglichkeiten zum auswählen einer Zeile an eine position in einem ResultSet - Regel können Sie festlegen, wie viele Zeilen zu überspringen und, wie viele Zeilen, die Sie wollen, aber es ist getan-unterschiedlich für verschiedene Datenbanken. Hier ist etwas, das funktioniert für mich in SQLite:
Es hängt in der Lage, verwenden Sie eine Unterabfrage in der limit-Klausel (die in der SQLite-LIMIT <recs zu überspringen>,<recs zu nehmen>) und Wählen Sie die Anzahl der Datensätze in einer Tabelle sollen besonders effizient sein, da es Teil der Datenbank die meta-Daten, aber das hängt von der Datenbank-Implementierung. Auch, ich weiß nicht, ob die Abfrage tatsächlich zu bauen, das Ergebnis vor dem abrufen des N-TEN Datensatz, aber ich würde hoffen, dass es nicht müssen. Beachten Sie, dass ich nicht die Angabe einer "order by" - Klausel. Es könnte besser sein ", um von" so etwas wie die Primärschlüssel, die haben einen index - abrufen der N-te Datensatz aus dem index könnte schneller sein, wenn die Datenbank kann nicht den N-TEN Datensatz aus der Datenbank selbst ohne Bau der Ergebnismenge.
InformationsquelleAutor der Antwort user1738579
In Oracle 12c, können Sie
OFFSET..FETCH..ROWS
option mitORDER BY
Z. B. den 3. Eintrag von oben:
InformationsquelleAutor der Antwort Kaushik Nayak
Für SQL server, im folgenden wird wieder die erste Zeile von der Tabelle.
Können Sie eine Schleife durch die Werte, die mit so etwas wie dies:
InformationsquelleAutor der Antwort sony vizio