409 votes

Comment choisir la nième ligne dans une table de base de données SQL ?

Je suis intéressé par l'apprentissage de quelques (idéalement) de base de données agnostique moyens de sélection de l'option *n*ième ligne à partir d'une table de base de données. Il serait également intéressant de voir comment cela peut être réalisé à l'aide de la fonctionnalité native de bases de données suivantes:

  • SQL Server
  • MySQL
  • PostgreSQL
  • SQLite
  • Oracle

Je suis actuellement en train de faire quelque chose comme ce qui suit dans SQL Server 2005, mais je serais curieux de voir d'autres de plus agnostique approches:

WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000

De crédit pour le SQL ci-dessus: Firoz Ansari Weblog

Mise à jour: Voir Troels Arvin de réponse au sujet de la norme SQL. Troels, avez-vous des liens, nous pouvons citer?

360voto

Henrik Gustafsson Points 11755

Il y a des manières de le faire dans des parties facultatives de la norme, mais un grand nombre de bases de données à l'appui de leur propre façon de faire.

Vraiment un très bon site qui parle de cela et d'autres choses, c'est http://troels.arvin.dk/db/rdbms/#select-limit.

Fondamentalement, PostgreSQL et MySQL prend en charge les non-standard:

SELECT...
LIMIT y OFFSET x 

Oracle, DB2 et MYSQL prend en charge la norme de fenêtrage fonctions:

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
    columns
  FROM tablename
) AS foo
WHERE rownumber <= n

(j'ai juste copié à partir du site lié ci-dessus, car je n'utilise jamais ces DBs)

Mise à jour: Comme de PostgreSQL 8.4 de la norme de fenêtrage fonctions sont prises en charge, attendez-vous donc le deuxième exemple de travailler pour PostgreSQL.

106voto

Neall Points 12075

L' LIMIT / OFFSET de syntaxe dans PostgreSQL est:

SELECT * FROM mytable ORDER BY somefield LIMIT 1 OFFSET 20;

Cet exemple sélectionne le 21e de ligne. OFFSET 20 dit Postgres pour ignorer les 20 premiers enregistrements. Si vous ne spécifiez pas un ORDER BY clause, il n'y a pas de garantie de l'enregistrement que vous obtiendrez en retour, ce qui est rarement utile.

Apparemment la norme SQL est muet sur la question limite hors de fou fonctions de fenêtrage, c'est pourquoi tout le monde met en œuvre différemment.

32voto

Bill Williams Points 680
<p>Je ne suis pas sûr de la partie, mais je sais que SQLite et MySQL n’est pas n’importe quel tri des lignes « par défaut ». Dans ces deux dialectes, au moins, l’extrait suivant saisit l’entrée 15 de the_table, Tri par date/heure qu'il a été ajouté :<pre><code></code></pre><p>(bien sûr, vous devrez avoir un ajout du champ DATETIME et affectez-lui la date/heure entrée ajoutée...)</p></p>

25voto

Ben Breen Points 706
<p>SQL 2005 et surtout a cette fonctionnalité intégrée. utiliser la fonction ROW_NUMBER(). C’est excellent pour les pages web avec une navigation de style << Prev et Next >> :<p>Syntaxe :</p><pre><code></code></pre></p>

18voto

Tim Saunders Points 3694
<p>Je soupçonne que c’est très inefficace, mais est tout à fait une approche simple, qui a travaillé sur un dataset petit que j’ai essayé sur.<pre><code></code></pre><p>Ce serait obtenir le 5ème élément, modifier le deuxième nombre supérieur pour obtenir un nième item différent</p><p>SQL server uniquement (je crois) mais devrait fonctionner sur des versions antérieures qui ne prennent pas en charge ROW_NUMBER().</p></p>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X