Comment puis-je demander une ligne aléatoire (ou proche de réellement aléatoire comme étant possible) en SQL pur ?
Réponses
Trop de publicités?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
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).