J'utilise MSSQL Server 2005. Dans ma base de données, j'ai une table "customerNames" qui a deux colonnes "Id" et "Name" et env. 1000 résultats.
Je crée 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?
Réponses:
Cela dit, tout le monde semble venir sur cette page pour la réponse plus générale à votre question:
Sélection d'une ligne aléatoire dans SQL
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:
Sélectionnez une ligne aléatoire avec sqlite:
la source
update tbl_vouchers set tbl_UsersID = (select top(1) id from tbl_Users order by NEWID())
- edit: je ne peux pas faire fonctionner le formatage dans les commentaires :(la source
Si quelqu'un veut une solution PostgreSQL:
la source
Peut - être que ce site vous sera utile.
Pour ceux qui ne veulent pas cliquer:
la source
Il existe une belle solution spécifique à Microsoft SQL Server 2005 ici. Traite le problème où vous travaillez avec un grand ensemble de résultats (pas la question que je connais).
Sélection aléatoire de lignes dans une grande table http://msdn.microsoft.com/en-us/library/cc441928.aspx
la source
Si vous avez une table avec des millions de lignes et que vous vous souciez des performances, cela pourrait être une meilleure réponse:
https://msdn.microsoft.com/en-us/library/cc441928.aspx
la source
Il s'agit d'une vieille question, mais tenter d'appliquer un nouveau champ (NEWID () ou ORDER BY rand ()) à une table avec un grand nombre de lignes coûterait trop cher. Si vous avez des ID incrémentiels et uniques (et que vous n'avez pas de trous), il sera plus efficace de calculer le X # d'ID à sélectionner au lieu d'appliquer un GUID ou similaire à chaque ligne, puis de prendre le X # supérieur.
Si vous vouliez sélectionner beaucoup plus de lignes, je chercherais à remplir un #tempTable avec un ID et un tas de valeurs rand () puis à utiliser chaque valeur rand () pour mettre à l'échelle les valeurs min-max. De cette façon, vous n'avez pas à définir tous les paramètres @ randomId1 ... n. J'ai inclus un exemple ci-dessous en utilisant un CTE pour remplir la table initiale.
la source
la source
J'ai trouvé que cela fonctionnait mieux pour les mégadonnées.
TABLESAMPLE(n ROWS) or TABLESAMPLE(n PERCENT)
est aléatoire mais doit être ajoutéTOP n
pour obtenir la taille d'échantillon correcte.L'utilisation
NEWID()
est très lente sur les grandes tables.la source
Comme je l'ai expliqué dans cet article , pour mélanger l'ensemble de résultats SQL, vous devez utiliser un appel de fonction spécifique à la base de données.
Donc, en supposant que nous ayons la table de base de données suivante:
Et les lignes suivantes du
song
tableau:Oracle
Sur Oracle, vous devez utiliser la
DBMS_RANDOM.VALUE
fonction, comme illustré par l'exemple suivant:Lors de l'exécution de la requête SQL susmentionnée sur Oracle, nous allons obtenir le jeu de résultats suivant:
serveur SQL
Sur SQL Server, vous devez utiliser la
NEWID
fonction, comme illustré par l'exemple suivant:Lors de l'exécution de la requête SQL susmentionnée sur SQL Server, nous allons obtenir le jeu de résultats suivant:
PostgreSQL
Sur PostgreSQL, vous devez utiliser la
random
fonction, comme illustré par l'exemple suivant:Lors de l'exécution de la requête SQL susmentionnée sur PostgreSQL, nous allons obtenir le jeu de résultats suivant:
MySQL
Sur MySQL, vous devez utiliser la
RAND
fonction, comme illustré par l'exemple suivant:Lors de l'exécution de la requête SQL susmentionnée sur MySQL, nous allons obtenir le jeu de résultats suivant:
la source
Si vous utilisez une grande table et souhaitez accéder à 10% des données, exécutez la commande suivante:
SELECT TOP 10 PERCENT * FROM Table1 ORDER BY NEWID();
la source