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 :

problème avec une requête imbriquée


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 49
    Points : 32
    Points
    32
    Par défaut problème avec une requête imbriquée
    salut,

    j'ai un petit souci avec une requête SQL, enfin le souci viens plutot de mysql mais bon...

    j'ai les trois tables suivantes :
    moderateur(moderId, moderName)
    domaine(domaineId, domaineName)
    moder_has_domaine(moderId, domaineId)
    cette derniere résultant de l'association n,n entre moderateur et domaine.

    pour connaitre les domaines qui sont modérés par un moderateur donné, aucun problème (simple select dans moder_has_domaine avec le moderId)

    mais je voudrais récupérer les domaines qui ne sont pas modérés par un modérateur donné. or MySQL ne connait pas l'opérateur MINUS et il a un peu de mal avec les requetes imbriquées...
    quelqu'un aurait-il une solution por favor

    merci a+

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 922
    Points : 51 715
    Points
    51 715
    Billets dans le blog
    6
    Par défaut
    MySQL n'accepte pas les sous requêtes...

    En revanche il est possible de construire cela avec des jointures externes.
    A lire : http://sqlpro.developpez.com/SQL_AZ_...considerations

    A +

  3. #3
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Ou de passer par des tables temporaires.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 49
    Points : 32
    Points
    32
    Par défaut
    salut,

    bon ben j'viens de regarder le liens mais bon je suis pas franchement un amoureux du sql et "jointure externe gauche" ben ça me parle pas du tout... désolé j'comprend pas en quoi ce type de requête peut m'aider à résoudre mon problème? et quelle est l'utilité de ces jointure.

    merci a +

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 49
    Points : 32
    Points
    32
    Par défaut
    voici le script de création des tables avec quelques inserts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    CREATE TABLE moderateur(
      moderId INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      moderTitre VARCHAR(4) NOT NULL,
      moderName VARCHAR(20) NOT NULL,
      moderPasswd VARCHAR(20) NOT NULL,
      moderEmail VARCHAR(30) NOT NULL,
      moderDateLastVisit DATETIME NULL,
      PRIMARY KEY(moderId)
    );
     
    INSERT INTO moderateur(moderId, moderTitre, moderName, moderPasswd, moderEmail)
    VALUES(1, 'M.', 'toto', 'ZJEbIwai', 'toto@toto.fr');
    INSERT INTO moderateur(moderId, moderTitre, moderName, moderPasswd, moderEmail)
    VALUES(2, 'M.', 'titi', 'Z8tFykMO', 'titi@titi.com');
     
    CREATE TABLE domaine(
      domaineId TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
      domaineName VARCHAR(25) NOT NULL,
      domaineDescribe TINYTEXT NULL,
      PRIMARY KEY(domaineId)
    );
     
    INSERT INTO domaine(domaineName, domaineDescribe) VALUES('AGAPS CL', 'Applicatif de Gestion Avancée des Professionnels de Santé (version Web)');
     
    INSERT INTO domaine(domaineName, domaineDescribe) VALUES('ARNO', 'ARNO');
     
    INSERT INTO domaine(domaineName, domaineDescribe) VALUES('AGATE', 'AGATE');
     
    INSERT INTO domaine(domaineName, domaineDescribe) VALUES('ASFA', 'ASFA');
     
    INSERT INTO domaine(domaineName, domaineDescribe) VALUES('Site Internet Almerys', 'Site Internet Almerys');
     
    CREATE TABLE moderateur_has_domaine(
      moderateur_moderId INTEGER(10) UNSIGNED NOT NULL,
      domaine_domaineId TINYINT(3) UNSIGNED NOT NULL,
      PRIMARY KEY(moderateur_moderId, domaine_domaineId),
      INDEX moderateur_has_domaine_FKIndex1(moderateur_moderId),
      INDEX moderateur_has_domaine_FKIndex2(domaine_domaineId),
      FOREIGN KEY Rel_12(moderateur_moderId)
        REFERENCES moderateur(moderId)
          ON DELETE NO ACTION
          ON UPDATE NO ACTION,
      FOREIGN KEY Rel_13(domaine_domaineId)
        REFERENCES domaine(domaineId)
          ON DELETE NO ACTION
          ON UPDATE NO ACTION
    );
     
    INSERT INTO moderateur_has_domaine(moderateur_moderId, domaine_domaineId)
     
    VALUES(2, 5);
     
    INSERT INTO moderateur_has_domaine(moderateur_moderId, domaine_domaineId)
     
    VALUES(2, 2);
     
    INSERT INTO moderateur_has_domaine(moderateur_moderId, domaine_domaineId)
     
    VALUES(2, 1);
     
    INSERT INTO moderateur_has_domaine(moderateur_moderId, domaine_domaineId)
     
    VALUES(1, 4);
     
    INSERT INTO moderateur_has_domaine(moderateur_moderId, domaine_domaineId)
     
    VALUES(1, 3);
     
    INSERT INTO moderateur_has_domaine(moderateur_moderId, domaine_domaineId)
     
    VALUES(1, 1);

  6. #6
    Membre actif
    Avatar de MashiMaro
    Profil pro
    Inscrit en
    Février 2003
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 180
    Points : 213
    Points
    213
    Par défaut
    Citation Envoyé par jaimepasteevy
    salut,

    bon ben j'viens de regarder le liens mais bon je suis pas franchement un amoureux du sql et "jointure externe gauche" ben ça me parle pas du tout... désolé j'comprend pas en quoi ce type de requête peut m'aider à résoudre mon problème? et quelle est l'utilité de ces jointure.

    merci a +
    Ouep mais t'as pas trop le choix si tu veux faire en une seule requête. Va falloir t'y mettre. D'autant que le site de SqlPRO est assez explicite.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 49
    Points : 32
    Points
    32
    Par défaut
    j'ai pas dis que j'voulais pas m'y mettre ; d'ailleur j'aurais préféré que tu m'explique un peu au lieu d'faire ce genre de commentaire... mais bon.................

  8. #8
    Membre actif
    Avatar de MashiMaro
    Profil pro
    Inscrit en
    Février 2003
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 180
    Points : 213
    Points
    213
    Par défaut
    Citation Envoyé par jaimepasteevy
    j'ai pas dis que j'voulais pas m'y mettre ; d'ailleur j'aurais préféré que tu m'explique un peu au lieu d'faire ce genre de commentaire... mais bon.................
    Je n'ai pas dit les choses de façon agressive et ce n'est ni mon but et ni but du forum.
    Pour ce qui est de l'explication, tout est dit dans le site de SQLPro à cet endroit : http://sqlpro.developpez.com/SQL_AZ_3.html
    Et je ne suis pas capable d'expliquer aussi bien que lui.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 922
    Points : 51 715
    Points
    51 715
    Billets dans le blog
    6
    Par défaut
    REMARQUES :
    1) il n'est pas correct d'avoir des colonnes de clef étrangère dont le nom diffère du nom de la clef référencée.
    Exemples :
    moderateur_moderId dans la table moderateur_has_domaine devrait s'apeller moderId
    domaine_domaineId dans la table moderateur_has_domaine devrait s'apeller domaineId
    C'est le même concept, donc, c'est le même nom. SQL l'impose si tu doit utiliser des NATURAL JOIN

    2) il manque une ligne dans ton jeu de donné afin qu'il soit pertinant. En effet tout tes domaines sont modéré. Or ce que tu veut obtenir c'est au moins un domaine non modéré. Or dans ton jeu d'essais il n'y en a aucun.

    SOLUTION :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT distinct d.*
    FROM   domaine d
           FULL OUTER JOIN moderateur_has_domaine h
                ON d.domaineId = h.domaine_domaineId
    WHERE h.domaine_domaineId IS NULL
    en ajoutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO domaine(domaineId, domaineName, domaineDescribe) VALUES(6, 'xxx', 'xxx')
    tu obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    domaineId   domaineName               domaineDescribe                                                                                      
    ----------- ------------------------- ----------------
    6           xxx                       xxx

    A +

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 49
    Points : 32
    Points
    32
    Par défaut
    merci beaucoup pour vos conseil.
    en fait ce que je veux obtenir c'est la liste des domaines qui ne sont pas modérés pour un modérateur ; par exemple le modérateur 1 modére les domaines 1,3 et 4 mais il ne modére pas les domaines 2 et 5 (c'est ce que je souhaiterai obtenir)

    c'est pour cela que je voulais faire :
    (selctionne tous les domaines)
    MINUS
    (selectionne les domaines du modérateur 'moderId')

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 922
    Points : 51 715
    Points
    51 715
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT domaineId 
    FROM   domaine 
    WHERE  domaineId NOT IN (SELECT domaineId 
                             FROM   domaine d
                                    INNER JOIN moderateur_has_domaine h
                                          ON d.domaineId = h.domaine_domaineId
                             WHERE  h.moderateur_moderId = 1)
    A +

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mai 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 49
    Points : 32
    Points
    32
    Par défaut
    merci encore.
    je vais passer a la version 4.1 de mysql qui suppprte les requetes imbriquées et j'pense de ça devrait fonctionner ; enfin j'espere

    a+

  13. #13
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Citation Envoyé par SQLpro
    REMARQUES :
    1) il n'est pas correct d'avoir des colonnes de clef étrangère dont le nom diffère du nom de la clef référencée.
    Exemples :
    moderateur_moderId dans la table moderateur_has_domaine devrait s'apeller moderId
    domaine_domaineId dans la table moderateur_has_domaine devrait s'apeller domaineId
    C'est le même concept, donc, c'est le même nom. SQL l'impose si tu doit utiliser des NATURAL JOIN
    Ok pour ce qui est du Natural Join. Maintenant, comment alors se depatouiller si on a deux cles etrangeres dans la meme table pointant sur la meme table.

    Ex.
    Une table Localite comprenant un ID_LOC
    Une table Personne comprenant 2 liens sur Localite (de avec associations "travaille" et "habite", tjs par ex.). Il faudra bien passer par deux champs "CodeLoc_habitat" et "CodeLoc_LieuTravail" et... tant pis pour le Natural Join.

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 922
    Points : 51 715
    Points
    51 715
    Billets dans le blog
    6
    Par défaut
    Dans ce cas de figure l'un des deux peut être de nom différent. Mais la plus utilisée, respecter cette forme. Ce que fait d'ailleurs Power Designer !

    A +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec une requête imbriquée
    Par Shadam dans le forum Développement
    Réponses: 2
    Dernier message: 21/01/2013, 17h43
  2. [TADOQuery] Problème avec une requête
    Par yannba dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/01/2006, 14h51
  3. Problème avec une requête
    Par demonark dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/09/2005, 06h35
  4. Problème avec une requête
    Par ringostarr dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/04/2005, 21h34
  5. Problème avec une requête
    Par snoopy69 dans le forum Débuter
    Réponses: 2
    Dernier message: 20/01/2005, 13h39

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