Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours 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 06/12/2010, 14h43   #1
Membre habitué
 
Homme
Développeur Web
Inscription : janvier 2008
Messages : 365
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2008
Messages : 365
Points : 140
Points : 140
Par défaut OUTER JOIN pour éviter un NOT IN

Bonjour,

Je voudrais réaliser une requête qui permet d'afficher les articles qui n'ont pas étaient cliqué (Sous MySQL) :

Code :
1
2
3
4
5
6
SELECT article.CodeArticle, 
       TitreItem 
FROM   article
       LEFT OUTER JOIN cliquer 
         ON Cliquer.CodeArticle = article.CodeArticle 
LIMIT  10
Cependant cette requête me retourne l'article 1 qui est présent dans la table 'cliquer'

Merci
Khleo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 15h01   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Pour avoir ceux qui ne sont pas cliqués, il ne faut garder que les lignes où il y a des NULLs :
Code :
1
2
3
4
5
6
7
SELECT article.CodeArticle, 
       TitreItem 
FROM article
    LEFT OUTER JOIN cliquer 
         ON Cliquer.CodeArticle = article.CodeArticle 
WHERE cliquer.CodeArticle IS NULL	 
LIMIT  10
Sinon avec NOT EXISTS "plus explicite" sémantiquement que la jointure externe:
Code :
1
2
3
SELECT a.CodeArticle, TitreItem 
FROM article a
WHERE NOT EXISTS (SELECT 1 FROM cliquer c WHERE c.CodeArticle = a.CodeArticle)
Pourquoi ne veux tu pas du NOT IN ?
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 15h07   #3
Membre habitué
 
Homme
Développeur Web
Inscription : janvier 2008
Messages : 365
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2008
Messages : 365
Points : 140
Points : 140
Merci pour la requête, elle fonctionne.

Je préfère éviter les IN et les NOT IN car ils utilisent beaucoup de ressource, j'avais des requêtes qui mettaient plusieurs dizaines de secondse à s'éxécuter.

Citation:
NOTA : beaucoup de requêtes utilisant le IN (comme le NOT IN) peuvent être simplifiées en utilisant des jointures. Le IN par des jointures internes, le NOT IN par des jointures externes associées à une clause HAVING COUNT(...) = 0. En général les performances seront meilleures en utilisant une jointure que dans le cas d'une sous-requête avec [NOT] IN.
http://sqlpro.developpez.com/cours/sqlaz/sousrequetes/
Khleo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 15h43   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 967
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 967
Points : 18 197
Points : 18 197
Envoyer un message via MSN à CinePhil
Puisque tu cites SQLPro, je te renvoie à un autre de ses articles où il recommande ceci :
Citation:
évitez les sous requêtes avec IN...

...lorsque vous pouvez utiliser EXISTS
Et il me semblait avoir vu quelque part que NOT EXISTS est aussi plus optimisé que LEFT JOIN... WHERE ... IS NULL. Il suffit qu'il trouve une ligne satisfaisant à la condition pour qu'il s'arrête de chercher et passe à la suivante au lieu de faire la jointure complète et de chercher les NULL ensuite. À confirmer par plus expert que moi.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h11.


 
 
 
 
Partenaires

Hébergement Web