558 votes

Comment demander une ligne aléatoire dans SQL ?

Comment puis-je demander une ligne aléatoire (ou proche de réellement aléatoire comme étant possible) en SQL pur ?

821voto

Yaakov Ellis Points 15470

Voir ce post: SQL pour Sélectionner une ligne au hasard à partir d'une table de base de données. Il va par le biais de méthodes pour le faire dans MySQL, PostgreSQL, Microsoft SQL Server, IBM DB2 et Oracle (ce qui suit est copié à partir de ce lien):

Sélectionner une ligne au hasard avec MySQL:

SELECT column FROM table
ORDER BY RAND()
LIMIT 1

Sélectionner une ligne au hasard avec PostgreSQL:

SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

Sélectionner une ligne au hasard avec Microsoft SQL Server:

SELECT TOP 1 column FROM table
ORDER BY NEWID()

Sélectionner une ligne au hasard avec IBM DB2

SELECT column, RAND() as IDX 
FROM table 
ORDER BY IDX FETCH FIRST 1 ROWS ONLY

Sélectionnez un enregistrement aléatoire avec Oracle:

SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1

178voto

Cd-MaN Points 7911

Des Solutions comme Jeremies:

SELECT * FROM table ORDER BY RAND() LIMIT 1

de travail, mais ils ont besoin d'un balayage séquentiel de la table (parce que le hasard de la valeur associée à chaque ligne doit être calculé de sorte que le plus petit peut être déterminé), qui peut être assez lente pour que même les petits tableaux. Ma recommandation serait d'utiliser une sorte d'numériques indexés colonne (nombre de tables ont comme leurs clés primaires), et puis écrire quelque chose comme:

SELECT * FROM table WHERE num_value >= RAND() * (SELECT MAX(num_value) FROM table) LIMIT 1

Cela fonctionne en temps constant, indépendamment de la taille de la table, si num_value est indexé. Une mise en garde: ceci suppose que l' num_value est distribué également dans la gamme 0..MAX(num_value). Si votre dataset fortement s'écarte de cette hypothèse, vous obtiendrez des résultats faussés (certaines lignes apparaissent plus souvent que d'autres).

64voto

Matt Hamilton Points 98268

Ne sais pas comment efficace il s’agit, mais je l’ai utilisé avant :

Parce que les GUID sont assez aléatoire, l’ordre signifie que vous obtenez une ligne aléatoire.

36voto

Neel Points 89
<pre><code></code><p><code></code></p><pre><code></code></pre><p><code></code>!</p><p>Je vais certainement aller avec cette dernière méthode.</p></pre>

18voto

cnu Points 6802

Trouvé ce par Google.

Sélectionnez une ligne aléatoire avec MySQL :

Sélectionnez une ligne aléatoire avec PostgreSQL :

Sélectionnez une ligne aléatoire avec Microsoft SQL Server :

Sélectionnez une ligne aléatoire avec IBM DB2

Sélectionnez un enregistrement aléatoire avec Oracle :

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