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 13/05/2011, 09h06   #1
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Par défaut Requêtes imbriquées d'exclusion

Bonjour à tous

mes souvenirs de SQL étant loin j'ai un peu de mal sur les trucs complexes.

J'ai 2 tables, "produits" et "sortis" qui ont une colonne commune produits.numero et sortis.num_mandat.

Je voudrais connaitre le nombre de lignes qui sont dans ma table produits sans être dans ma table sortis.

Merci d'avance de votre aide.

Version MySql : 5.0.27
Version PhpMyAdmin : 2.8.2.4
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 09h26   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
bonjour

c'est a dire le nombre de produits qui n'ont jamais ete achetes (sortis) ?


Code :
1
2
3
4
SELECT COUNT(*)
     FROM Produits
         LEFT JOIN Sortis ON (Produits.numero = sortis.num_mandat)
WHERE sortis.num_mandat IS NULL
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 09h32   #3
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
C'est exactement ça

J'ai réécris je m'étais gouré dans le nom des tables ^^
Code :
1
2
3
4
SELECT COUNT(*)
     FROM produit
         LEFT JOIN sortis ON (produit.numero = sortis.num_mandat)
WHERE sortis.num_mandat IS NULL
Pour l'instant ma requête tourne dans le vide, bizarre non ?

Pour info j'ai environ 30 000 lignes dans chaque table.
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 09h40   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
bonjour,

Que veux dire tourne dans le vide ?

Avez-vous un index sur numero et num_mendat ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 09h47   #5
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Quand je dit tourne dans le vide c'est que je lance ma requête dans PhpMyAdmin et la ma page charge longtemps avant de m'afficher une page blanche...

Sur le monitoring serveur, Mysql est monté très très haut en charge, jusqu'à 100% du CPU et redescend tres doucement.

Les tables produit et sortis ont toutes deux un identifiant unique. Qui est la colonne numero pour la table produit et la colonne num_mandat pour la table sorti.
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 09h49   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
sont-ils indexés ?

Peut-etre sont-ils des primary key ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 09h53   #7
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Oui ce sont des Primary Key
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 09h57   #8
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
ca veut dire qu'il n'y a pas de jointure entre les 2 tables ? (de colonnes communes)


peut etre bien de donner la structure des 2 tables
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 10h06   #9
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

Je sais pas trop comment MySQL optimise... le must serait que tu nous donnes le plan d'exécution

Cela dit j'imagine bien MySQL avoir du mal avec les jointures externes (comment ça je suis médisant ? )...

Tu peux peut être tenter :

Code :
1
2
3
4
5
6
 
SELECT COUNT(*)
FROM Produits a
WHERE NOT EXISTS (SELECT NULL
                  FROM sortis b
                  WHERE a.numero = b.num_mandat)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 10h07   #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
Bonjour

que donne cette requête ?

Code SQL :
1
2
3
4
5
6
7
8
 
SELECT COUNT(*)
FROM produit
WHERE NOT EXISTS (
    SELECT *
    FROM sortis 
    WHERE sortis.num_mandat = produit.numero 
)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 10h25   #11
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
aieeeuuuu et pacmann,
cette phrase me laisse perplexe :
Citation:
Les tables produit et sortis ont toutes deux un identifiant unique. Qui est la colonne numero pour la table produit et la colonne num_mandat pour la table sorti.
BenoitDenis
peux tu preciser la structure des tables
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 10h37   #12
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Oui oui messieurs me tapez pas ^^ j'ai bien lu tous vos messages mais suis un peu débordé avec plusieurs projets de front

Je reviens vers vous dès que j'ai 5 minutes y'a pas urgence

Je vous enverrai un stagiaire que je vais mettre sur l'affaire

Je connais pas par coeur la structure de la base elle nous est fournie par un prestataire externe
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 10h41   #13
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Preferez la solution de pacmann.
En effet, vous beneficierez de l'utilisation des indexes, d'une volumétrie moindre que par la jointure externe.

dans votre table sortie, vous devez avoir une colonne faisant la relation avec le produit, c'est avec celle ci que vous devez jouer pour votre requete.

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h07   #14
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Citation:
Envoyé par Yanika_bzh Voir le message
Preferez la solution de pacmann.
En effet, vous beneficierez de l'utilisation des indexes, d'une volumétrie moindre que par la jointure externe.
Bonjour,

Ceci est spécifique à l'optimiseur (erm ...) de MySql je suppose ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h14   #15
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
sur la non utilisation d'index sur des colonnes NULL ??
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h18   #16
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Normalement, on n'a pas de problème d'indexation de NULL, puisque la colonne est sensée être PK

Après Punkoff, le seul moyen de savoir ce qui se passe, c'est d'avoir les plans d'exécution pour les différentes solutions
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h20   #17
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
pas avec l'utilisation de la jointure externe...
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h30   #18
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Citation:
Envoyé par Yanika_bzh Voir le message
pas avec l'utilisation de la jointure externe...
Pouvez-vous developper ?

En particulier avec quel SGBD vous testez ceci.

Car perso sous oracle j'ai 3 plans d'executions identiques en faisant :
- left outer join
- not in
- not exists

Et il me semble que sous db2 c'est pareil (je ne peux pas vérifier pour l'instant)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h37   #19
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Citation:
Envoyé par Yanika_bzh Voir le message
pas avec l'utilisation de la jointure externe...
Oui mais de toutes façons, tu as les NULL après exécution de la jointure externe. (En gros, ce n'est pas les NULL qui t'empêchent d'utiliser l'index, c'est le fait que tu aies déjà exécuté la jointure...)

Si tu veux réaliser la jointure externe, tu peux faire :
- Prendre les lignes de la table A
- Chercher si la clef de jointure existe dans l'index
si oui : retourner ligne
si non : retourner null

(Après, je sais pas si MySQL est capable de faire ça...)

Et comme dit Punkoff, dans d'autres SGBD il est avéré que le même plan peut être utilisé en détectant la recherche de null (NESTED LOOP ANTI ou un truc du genre)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 12h37   #20
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par punkoff Voir le message
Pouvez-vous developper ?

En particulier avec quel SGBD vous testez ceci.

Car perso sous oracle j'ai 3 plans d'executions identiques en faisant :
- left outer join
- not in
- not exists

Et il me semble que sous db2 c'est pareil (je ne peux pas vérifier pour l'instant)
ASE 12 par exemple.

Il me semble qu'a partir de la V10 d'Oracle, l'optimisateur reecrit le not in en not exists ... a confirmer.

Vous pouvez aussi aller faire un tour ici , ou bien la.
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h07.


 
 
 
 
Partenaires

Hébergement Web