Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
542 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  jointure ou requete imbriquée ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

jointure ou requete imbriquée ?

n°445782
art_dupond
je suis neuneu... oui oui !!
Posté le 01-07-2003 à 23:40:07  profilanswer
 

yop,
 
 
 
j'ai par exemple une table avec disons 1000 éléments (100 joueurs et 10 tournois)
 
 


[g]joueur[/g]       [g]point[/g]     [g]tournoi[/g]
 
...
alphonse      250        T1
...
josianne      75         T2
...
josianne      854        T1
...
alphonse      50         T2
...


 
 
 
un joueur a participé à plusieurs tournois.
 
On veut les tournois où josianne à eu plus de points qu'alphonse.
 
 
solution 1:
 
select * from table "t" where joueur='josianne' and points > (select points from table where joueur='alphonse' and tournoi=t.tournoi);
 
 
 
solution 2:
 
select * from table "t", table where t.joueur='josianne' and joueur='alphonse' and t.tournoi=tournoi and t.points > points;
 
 
autre solution ?
 
 
 
quelle est la best solution ?
 
en fait, je me dis que pour la jointure il fait un produit cartésien avant et du coup ca me semble tres lourd.
Mais bon je connais pas bien et y a surement des subtilités qui doivent m'échapper, du genre qu'il ferait peut etre le produit cartésien seulement après avoir isolé les lignes 'josianne' et les lignes 'alphonse'.
 
enfin j'en sais rien c'est pour ca que je demande :p  
 
 
 
en fait, plus généralement, je voudrais savoir s'il vaut mieux faire l'un ou l'autre, ou s'il y a des cas plus favorables pour une solution ou l'autre.
 
 
merci
 
 
 
je suis neuneu ! n'est-ce pas ?


---------------
oui oui
mood
Publicité
Posté le 01-07-2003 à 23:40:07  profilanswer
 

n°445807
nraynaud
lol
Posté le 01-07-2003 à 23:51:04  profilanswer
 

art_dupond a écrit :


solution 1:
 
select * from table "t" where joueur='josianne' and points > (select points from table where joueur='alphonse' and tournoi=t.tournoi);
 
 
 
solution 2:
 
select * from table "t", table where t.joueur='josianne' and joueur='alphonse' and t.tournoi=tournoi and t.points > points;
 


solution 2.
Règle générale : si t'as une BDD douteuse (au hasard MySQL) prends systématiquement le 2. Sinon, prends le plus lisible, l'optimiseur fera la tranformation qu'il voudra (inlining et beta-reduction pour passer de 2 à 1 par ex.) si c'est pas optimal.
 
et fait gaffe à pas oublier les index sur les colones que tu joins.


---------------
trainoo.com, c'est fini
n°445823
art_dupond
je suis neuneu... oui oui !!
Posté le 01-07-2003 à 23:57:38  profilanswer
 

ok,  
 
 
donc sous oracle par exemple les deux seront kif si j'ai bien compris...


---------------
oui oui
n°446428
MagicBuzz
Posté le 02-07-2003 à 15:25:48  profilanswer
 

Euh... L'optimiseur est bien, mais faut pas pousser non plus, la première solution, je vois ça dans du code, je quite l'éditeur et je del le fichier, ça sera plus rapide de repartir de rien que d'un code aussi propre que des chiottes publiques.
 
Sous Oralce
 
Exemple :
 


select count(*) from tie
 
48649 lignes
 
 
select * from tie
where codsoc = 0
and typtie = 'CLI'
and posfis = 'A'
 
78 ms
 
 
select * from tie
where codsoc = 0
and typtie = 'REP'
and famtie = 'REP'
and posfis = 'A'
and codzn4 = 'FR'
 
328 ms
 
 
select * from tie
where codsoc = 0
and typtie = 'CLI'
and posfis = 'A'
and sigrep in (select sigtie from tie
         where codsoc = 0
      and typtie = 'REP'
      and famtie = 'REP'
      and posfis = 'A'
      and codzn4 = 'FR')
 
774 ms
 
 
select t1.* from tie t1, tie t2
where t2.codsoc = 0
and t2.typtie = 'REP'
and t2.famtie = 'REP'
and t2.posfis = 'A'
and t2.codzn4 = 'FR'
and t1.codsoc = 0
and t1.typtie = 'CLI'
and t1.posfis = 'A'
and t1.sigrep = t2.sigtie
 
94 ms


 
=> La jointure est plus rapide que chacune des deux requête à la suite. Alors je te parle même pas de la solution batarde de sous-requête...


Message édité par MagicBuzz le 02-07-2003 à 15:26:52

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  jointure ou requete imbriquée ?

 

Sujets relatifs
[Oracle] Requete conditionnelle[PHP] SUBSTR dans une requête SQL?
Requete SQL : C tout con, mais ca me bloque :([DirecX] pb jointure textures
Requete sous SQL SERVER avec Auto-Increment[SQL] Requête pour obtenir la liste des tables [résolu]
[Delphi] faire une requete web ?Aide pour uen requête SQL d'ajout
Aide pour une requete "nombre de connexion par tranche horaire"SQL : mieux vaut une jointure ou une requete imbriquée ???
Plus de sujets relatifs à : jointure ou requete imbriquée ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR