271 votes

Comment sélectionner aléatoirement des lignes en SQL ?

J'utilise MSSQL Server 2005. Dans ma base de données, j'ai une table "customerNames" qui a deux colonnes "Id" et "Name" et environ 1 000 résultats.

Je suis en train de créer une fonctionnalité où je dois choisir 5 clients au hasard à chaque fois. Quelqu'un peut-il me dire comment créer une requête qui obtiendra 5 lignes aléatoires (Id, et Nom) à chaque fois que la requête est exécutée ?

0 votes

Le hasard n'est pas une exigence courante pour une base de données, j'ai été surpris de trouver une lien pour un certain SQL

2 votes

Cela dépend de la part d'aléatoire que vous souhaitez. Voir : msdn.microsoft.com/fr/us/library/aa175776(SQL.80).aspx pour la comparaison entre NEW_ID et RAND()

761voto

Curtis Tasker Points 2239
SELECT TOP 5 Id, Name FROM customerNames
ORDER BY NEWID()

Cela dit, tout le monde semble venir sur cette page pour obtenir une réponse plus générale à votre question :

Sélection d'une ligne aléatoire en SQL

Sélectionnez une ligne aléatoire avec MySQL :

SELECT column FROM table
ORDER BY RAND()
LIMIT 1

Sélectionnez une ligne aléatoire avec PostgreSQL :

SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

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

SELECT TOP 1 column FROM table
ORDER BY NEWID()

Sélectionnez une ligne aléatoire 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

Sélectionnez une ligne aléatoire avec sqlite :

SELECT column FROM table 
ORDER BY RANDOM() LIMIT 1

6 votes

+1 pour avoir posté les réponses directement sur SO au lieu de faire un lien vers un site externe (comme la réponse acceptée) qui aurait pu tomber en panne lorsque les futurs utilisateurs regarderont cette question.

24 votes

Cela devient-il très coûteux pour les grandes tables, où chaque ligne reçoit un numéro aléatoire, puis un grand ensemble de numéros aléatoires non indexés est trié ?

0 votes

C'est peut-être évident pour la plupart des gens, mais ça ne l'était pas pour moi... la requête suivante n'obtiendra pas une nouvelle valeur aléatoire pour chaque ligne : update tbl_vouchers set tbl_UsersID = (select top(1) id from tbl_Users order by NEWID()) - edit : je n'arrive pas à faire fonctionner le formatage dans les commentaires :(

38voto

Cody Caughlan Points 18780
SELECT TOP 5 Id, Name FROM customerNames ORDER BY NEWID()

13voto

Barry Brown Points 9774

Au cas où quelqu'un voudrait une solution PostgreSQL :

select id, name
from customer
order by random()
limit 5;

0 votes

Cette réponse est bonne pour PostgreSQL, qui n'a pas besoin de la limite.

10voto

Joe Points 5298

Peut-être ce site vous sera utile.

Pour ceux qui ne veulent pas cliquer dessus :

SELECT TOP 1 column FROM table
ORDER BY NEWID()

4 votes

Il aurait fallu au moins remplacer 1 par 5 :)

8voto

johnc Points 41

Il existe une belle solution spécifique à Microsoft SQL Server 2005 ici. Elle traite du problème lorsque vous travaillez avec un grand ensemble de résultats (ce n'est pas la question que je connais).

Sélection aléatoire de rangs dans un grand tableau http://msdn.microsoft.com/en-us/library/cc441928.aspx

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