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 WHERE


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 7
    Par défaut Problème avec WHERE
    Bonsoir,

    Voila, mon problème est assez simple, mais je n'arrive pas à le résoudre

    J'ai 3 Tables:

    Ouvrage(ou_id, titre, genre, année)
    Auteur(aid, nom, prénom, pseudo)
    a_ecrit(ou_id, aid, rôle)

    mon problème concerne le rôle, sachant que ce dernier n'a pour valeur que ("Auteur", "Dessinateur")
    Je voudrais sélectionner les ouvrages pour lesquels l'auteur est aussi le dessinateur.

    Sous SQLdeveloper, je fais ceci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select ouvrage.titre 
    from ouvrage, a_ecrit 
    where ouvrage.ou_id = a_ecrit.ou_id 
        and a_ecrit.rôle = 'Auteur' 
        and a_ecrit.rôle = 'Dessinateur';
    Mais ça ne marche pas, la requête est syntaxiquement correcte mais ça ne renvoie rien, pourtant dans mon jeu d'essai, il y'a effectivement un ouvrage(ou_id) pour lequel le même auteur(aid) est Auteur et Dessinateur.
    Voici mon jeu d'essai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    OU_ID | AID | RÔLE
    -------
    1          1      Auteur
    2          2      Auteur
    2          1      Dessinateur
    1          1      Dessinateur
    me suis je trompé? que devrais je changer? Merci.

  2. #2
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Bonsoir mast3r,


    Si l’on vous suit, pour chaque ligne de la table :
    Si la personne qui figure dans cette ligne est auteur, il faut qu’elle y soit aussi dessinateur, ce qui ne fonctionne pas puisque que cet autre rôle est forcément dans une autre ligne de la table...
    Il faut que vous procédiez comme si une 1re table contenait les auteurs et une autre table les dessinateurs : si Albert figure dans les deux tables alors c’est bon.

    Comme vous n’avez en réalité qu’une seule table, vous utiliserez une auto-jointure (x et y symbolisent les deux tables hypothétiques) :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   a_ecrit AS x INNER JOIN a_ecrit AS y ON x.ou_id = y.ou_id AND x.AID = y.AID
    WHERE  x.RÔLE = 'Dessinateur' AND y.RÔLE = 'Auteur' ;

  3. #3
    Membre Expert
    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
    Par défaut
    AU fait ce serait bien d'utiliser la syntaxe sur les jointures en place depuis plus de 20 ans


    un autre solution consisterait à chercher les auteurs qui ont 2 casquettes au travers d'une sous-requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.aid, COUNT(*)
    FROM auteur a
       INNER JOIN a_ecrit e ON e.aid = a.aid
    GROUP BY a.aid, a.nom 
    HAVING COUNT(*) = 2
    Ensuite utiliser cette requête pour sélectionner les ouvrages concernés (si telle est l'objectif)

  4. #4
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Bonjour,


    Citation Envoyé par dehorter olivier Voir le message
    ce serait bien d'utiliser la syntaxe sur les jointures en place depuis plus de 20 ans
    Pourriez-vous expliquer ce qui au plan de la syntaxe ne vous convient pas ? Ne dites quand même pas que vous voudriez qu’on mélange jointure et restriction.

  5. #5
    Membre Expert
    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
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Bonjour,

    Pourriez-vous expliquer ce qui au plan de la syntaxe ne vous convient pas ? Ne dites quand même pas que vous voudriez qu’on mélange jointure et restriction.
    je ne parlais pas de votre requête, mais de celle de mast3r
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ouvrage.titre 
    FROM ouvrage, a_ecrit 
    WHERE ouvrage.ou_id = a_ecrit.ou_id 
    ....
    et au que non

  6. #6
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    un autre solution consisterait à chercher les auteurs qui ont 2 casquettes au travers d'une sous-requête
    Attention, votre requête ne répond pas à la demande :
    Supposons que M. Albert soit l’auteur et l’illustrateur de l’ouvrage « Inner join et NULL pour les nuls » et qu’il soit aussi l’auteur de l’ouvrage « Tout sur la norme SQL ». Le résultat du comptage est en l’occurrence > 2, donc M. Albert ne figure pas dans le résultat. Qui plus est, si M. Bernard est l’auteur de « L’union de la carpe et du lapin » et l’illustrateur de « Qu’est-ce qu’Having ? » et n’a rien commis d’autre, alors il figure à tort dans le résultat...
    Accessoirement, votre requête n’est pas emboîtée (SELECT mis entre parenthèses), donc selon la norme SQL 2003 elle n’est pas une sous-requête (subquery).


    Citation Envoyé par dehorter olivier Voir le message
    ne parlais pas de votre requête, mais de celle de mast3r
    La jointure proposée par mast3r est tout à fait respectable. Au point que, paradoxe ! Chris Date qui est l’inventeur de la formulation de la jointure qui a votre faveur continue à utiliser la forme « FROM A, B », c'est vous dire...

Discussions similaires

  1. Problème avec WHERE
    Par stephane432 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 15/06/2007, 17h18
  2. problème avec WHERE champ = NULL
    Par Tchupacabra dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/03/2007, 22h28
  3. Réponses: 5
    Dernier message: 10/07/2006, 12h05
  4. Problème avec le WHERE
    Par izou9002 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/01/2006, 15h03
  5. Problème avec UNION et WHERE
    Par portu dans le forum Langage SQL
    Réponses: 13
    Dernier message: 20/04/2005, 11h29

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