IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requêtes imbriquées d'exclusion


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    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

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    bonjour

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


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*)
         FROM Produits
             LEFT JOIN Sortis ON (Produits.numero = sortis.num_mandat)
    WHERE sortis.num_mandat IS NULL

  3. #3
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    C'est exactement ça

    J'ai réécris je m'étais gouré dans le nom des tables ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    Que veux dire tourne dans le vide ?

    Avez-vous un index sur numero et num_mendat ?

  5. #5
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    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.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    sont-ils indexés ?

    Peut-etre sont-ils des primary key ?

  7. #7
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    Oui ce sont des Primary Key

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    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

  9. #9
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    que donne cette requête ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT COUNT(*)
    FROM produit
    WHERE NOT EXISTS (
        SELECT *
        FROM sortis 
        WHERE sortis.num_mandat = produit.numero 
    )

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    aieeeuuuu et pacmann,
    cette phrase me laisse perplexe :
    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

  12. #12
    Membre actif Avatar de BenoitDenis
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    536
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2005
    Messages : 536
    Points : 237
    Points
    237
    Par défaut
    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

  13. #13
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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

  14. #14
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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 ?

  15. #15
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    sur la non utilisation d'index sur des colonnes NULL ??

  16. #16
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    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

  17. #17
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    pas avec l'utilisation de la jointure externe...

  18. #18
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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)

  19. #19
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    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)

  20. #20
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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.

Discussions similaires

  1. Pb requête imbriquée
    Par ddams dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/04/2004, 13h13
  2. [Requête] Faire une requête imbriquée?
    Par sekiryou dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2004, 23h52
  3. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 11h29
  4. Requêtes imbriquées ?
    Par Ph. B. dans le forum XMLRAD
    Réponses: 7
    Dernier message: 06/05/2003, 14h19
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 17h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo