Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/03/2011, 10h32   #1
Membre Expert
 
Avatar de zooffy
 
Homme Erick OZOUF
Développeur Web
Inscription : août 2004
Messages : 3 378
Détails du profil
Informations personnelles :
Nom : Homme Erick OZOUF
Âge : 42
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2004
Messages : 3 378
Points : 1 330
Points : 1 330
Envoyer un message via MSN à zooffy Envoyer un message via Skype™ à zooffy
Par défaut Faire un select aléatoire

Bonjour à tous

Je voudrais savoir s'il est posible de faire un Select aléatoire, je m'explique : dans un premier cas je dois faire un Select TOP 10 car je ne veux que 10 enregistrement selon les clauses WHERE appliquées, mais je voudrias que les enregsitrements concernés soient pris a hasard parmi l'ensemble des enregsitrements répondant aux clauses WHERE.

Dans un deuxième cas, je voudrais faire un SELECT avec des clauses WHERE mais que l'ordre des enregistrement soit aléatoire.

En gros, entre deux lancements de la requête je voudrais que le résultat ne soit pas "rangé" pareil.

Et le tout sans avoir à reprogrammer une usine à gaz.

Donc la question est en fait simple : SQL sait il faire cela ou dois je gérer la chose dans mon langage de programmation surjaccent ?

Merci pour votre aide.
__________________
Mon blog de création d'univers : Qualhiryann
Mon site qui parle de moi moi.ozouf.com
zooffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 11h13   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 446
Points : 10 446
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Quand je cherche à faire de l'aléatoire, je fais un tri sur une donnée complètement abstraite, par exemple la nième décimale d'un id quelconque divisé par le nombre de millisecondes au moment de l'exécution de la requête.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 11h25   #3
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
Pourquoi ne pas utiliser le résultat d'une fonction de type Random Waldar ?
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 11h36   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 446
Points : 10 446
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
La fonction rand() n'est évaluée qu'une fois par requête (sur SQL-Server 2005 en ce qui me concerne) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT top 10 rand() AS random
  FROM master.dbo.sysobjects
 
random
----------------------
0,878672817457053
0,878672817457053
0,878672817457053
0,878672817457053
0,878672817457053
0,878672817457053
0,878672817457053
0,878672817457053
0,878672817457053
0,878672817457053
Effectuer un tri là-dessus ne serait donc pas très pertinent.

Il y a sûrement moyen de faire mieux différemment, je ne le conteste pas, mais je n'ai pas trouvé de méthode simple sans programmation qui le permette.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 11h36   #5
Membre Expert
 
Avatar de zooffy
 
Homme Erick OZOUF
Développeur Web
Inscription : août 2004
Messages : 3 378
Détails du profil
Informations personnelles :
Nom : Homme Erick OZOUF
Âge : 42
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2004
Messages : 3 378
Points : 1 330
Points : 1 330
Envoyer un message via MSN à zooffy Envoyer un message via Skype™ à zooffy
Merci pour votre aide.

@Waldar : tu aurais un exemple de déclaration dans le Order BY, je vois pas trés bien comment faire ?

@vmolines : ah, y a une fonction Random en SQL server ?
Et tu aurais un lien vers une doc, par hasard ?
__________________
Mon blog de création d'univers : Qualhiryann
Mon site qui parle de moi moi.ozouf.com
zooffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 11h37   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

pour ma part, je fais ceci :

Code SQL :
1
2
3
4
 
SELECT TOP(10) MesColonnes
FROM MaTable
ORDER BY NEWID()
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/03/2011, 11h41   #7
Membre Expert
 
Avatar de zooffy
 
Homme Erick OZOUF
Développeur Web
Inscription : août 2004
Messages : 3 378
Détails du profil
Informations personnelles :
Nom : Homme Erick OZOUF
Âge : 42
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2004
Messages : 3 378
Points : 1 330
Points : 1 330
Envoyer un message via MSN à zooffy Envoyer un message via Skype™ à zooffy
Citation:
Envoyé par Waldar Voir le message
La fonction rand() n'est évaluée qu'une fois par requête (sur SQL-Server 2005 en ce qui me concerne) :
Moi je suis sur 2008 Express, ça change un truc ?

Citation:
Envoyé par Waldar Voir le message
Effectuer un tri là-dessus ne serait donc pas très pertinent.

Il y a sûrement moyen de faire mieux différemment, je ne le conteste pas, mais je n'ai pas trouvé de méthode simple sans programmation qui le permette.
Arf, le temps d'écrire mon post et tu avais répondu.

Alors, sans programmation, pas exactement, plutôt sans TROP de programmation.

En écrivant je viens de voir la réponse de aieeeuuuu (ça fais si mal que ça ???!!!!!)

ça me parait être une bonne idée, en fait, pourquoi n'y ai je pas pensé plus tôt ?
Et sur un Order By comme ça, je suppose que je ne rajoute aucun autre critère, il doit rester seul ?

Merci à tous, je crois qu'on tient le bon bout là.
__________________
Mon blog de création d'univers : Qualhiryann
Mon site qui parle de moi moi.ozouf.com
zooffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 11h49   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 446
Points : 10 446
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Très bien la réponse de aieeeuuuuu.

En fait la fonction que j'ai décrite je m'en était servi pour remplir une table avec
des nombres générés au hasard sur un challenge T-SQL ; pour le tri le newid() suffit largement !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 11h57   #9
Membre Expert
 
Avatar de zooffy
 
Homme Erick OZOUF
Développeur Web
Inscription : août 2004
Messages : 3 378
Détails du profil
Informations personnelles :
Nom : Homme Erick OZOUF
Âge : 42
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2004
Messages : 3 378
Points : 1 330
Points : 1 330
Envoyer un message via MSN à zooffy Envoyer un message via Skype™ à zooffy
Ok, merci à tous, je clique sur le bouton "résolu".
__________________
Mon blog de création d'univers : Qualhiryann
Mon site qui parle de moi moi.ozouf.com
zooffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 11h59   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par zooffy Voir le message
Et sur un Order By comme ça, je suppose que je ne rajoute aucun autre critère, il doit rester seul ?
Tu peux ajouter des colonnes devant. dans ce cas, ça ne sera plus vraiment aléatoire, mais aléatoire dans la fenêtre des données pour les colonnes placées devant, donc pas très utile

tu peux aussi ajouter des colonnes après NEWID... mais cela ne servira à rien, puisque NEWID sera unique...

Je ne sais pas si c'etait le fond de la question, mais tu peux parfaitement ajouter une clause WHERE

Enfin, si tu veux classer tes 10 resultats, tu peux englober la requete dans une pseudo table :
Code SQL :
1
2
3
4
5
6
7
8
9
 
SELECT * 
FROM (
	SELECT TOP(10) MaColonne1, MaColonne2, MaColonne3
	FROM MaTable
	[WHERE ...]
	ORDER BY NEWID()
) AS DonneesAleatoire
ORDER BY MaColonne3, MaColonne2
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 12h01   #11
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Autre possibilité (de plus prévue par la norme SQL) et qui fonctionne sous SQL Server : utiliser TABLESAMPLE

Code :
1
2
SELECT TOP(10) MesColonnes
FROM   MaTable TABLESAMPLE (20 PERCENT)
A mon sens ce sera beaucoup plus performant !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/03/2011, 12h05   #12
Membre Expert
 
Avatar de zooffy
 
Homme Erick OZOUF
Développeur Web
Inscription : août 2004
Messages : 3 378
Détails du profil
Informations personnelles :
Nom : Homme Erick OZOUF
Âge : 42
Localisation : France, Morbihan (Bretagne)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2004
Messages : 3 378
Points : 1 330
Points : 1 330
Envoyer un message via MSN à zooffy Envoyer un message via Skype™ à zooffy
Encore merci.

Je vais faire des tests avec tout ça.
__________________
Mon blog de création d'univers : Qualhiryann
Mon site qui parle de moi moi.ozouf.com
zooffy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 12h21   #13
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
@SQLPro

La doc sur TABLESAMPLE indique de ne pas l'utiliser pour obtenir des données réellement aléatoires...

Il semble que ce soit les pages de données "choisies" qui soient aléatoires...
mais que l'ensemble de chaque page est retourné.

ils donnent même un exemple (que je trouve tordu) utilisant également NEWID() pour obtenir un pourcentage de données aléatoires...

Enfin, la clause WHERE est appliquée après l’échantillonnage, donc on n'obtiendra pas forcément le nombre voulu de lignes.

Je pense que sur des faibles volumétries, TABLESAMPLE est difficile à appliquer. Par contre en effet, sur des très grosses volumétries, ca peut apporter un gain de perfs(en évitant un ORDER BY sur des millions de lignes), et dans ce cas je combinerais les deux solutions (TABLESAMPLE + NEWID) afin d'avoir des valeurs réellement aléatoires tout en limitant la la charge. (mais la encore, rien ne garantit le nombre de lignes de resultats, et TABLESAMPLE n'est pas applicable à une table dérivée...)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h32.


 
 
 
 
Partenaires

Hébergement Web