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 :

Demande d'aide compréhension requête


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Points : 48
    Points
    48
    Par défaut Demande d'aide compréhension requête
    Sur le principe : il vaut mieux paraître bête et ne pas le rester longtemps plutôt que de ne rien dire et le rester, je sollicite votre aide pour comprendre la différence entre les deux requêtes suivantes :

    Requête 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT id_oeuvre
    FROM oeuvre, oeuvre_description
    WHERE oeuvre.id_oeuvre = oeuvre_description.ref_oeuvre_oeuvre_description
    AND oeuvre_description.texte_oeuvre_description LIKE '%cela%'
    OR oeuvre.libelle_oeuvre LIKE '%cela%'
    et
    Requête 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT id_oeuvre
    FROM oeuvre, oeuvre_description
    WHERE oeuvre.id_oeuvre = oeuvre_description.ref_oeuvre_oeuvre_description
    AND ( 
    oeuvre_description.texte_oeuvre_description LIKE '%cela%'
    OR oeuvre.libelle_oeuvre LIKE '%cela%'
    )
    sachant que Requête 1 me ramène un résultat, le mot "cela" était dans oeuvre_libelle et que Requête 2 ne me ramène rien.

    Merci d'avance

    Nico

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    bah les parenthèses

    dans la 1ere, cela doit respecter la condition 1 et 2, ou bien la condition 3
    dans la 2eme, cela doit respecter la condition1 et (la condition 2 ou 3à, autrement dit condition 1 et 2 ou condition 1 et 3
    donc ta 2eme requête me semble plus correcte

    d'ailleurs, je l'écrirais plus comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT id_oeuvre
    FROM oeuvre JOIN oeuvre_description
    ON oeuvre.id_oeuvre = oeuvre_description.ref_oeuvre_oeuvre_description
    WHERE oeuvre_description.texte_oeuvre_description LIKE '%cela%'
    OR oeuvre.libelle_oeuvre LIKE '%cela%'

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Il y a une priorité du AND sur le OR. Souvenez-vous des cours de math de collège avec la priorité de la multiplication sur l'addition...

    La première requête fait (A et B) ou C alors que la deuxième requête fait A et (B ou C). C'est pas la même chose.

    Par ailleurs, l'écriture normale des jointures est de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.col1, a.colb..., b.Colb1
    FROM a
    INNER JOIN b ON a.col1 = b.cola1
    Une bonne habitude à prendre pour relire ses requêtes plus facilement, les modifier ou les débugguer éventuellement.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Merci pour vos réponses très rapides.

    Grâce à vos réponses, j'ai compris pourquoi je ne comprenais pas : je faisais totalement abstraction de la condition de jointure entre les deux tables id_oeuvre/ref_oeuvre et je ne prenais finalement en compte que les conditions sur description et libellés.
    Sachant cela, oui, la requête est mal construite, je devrais utiliser INNER JOIN comme vous le proposez.

    Merci et bonne journée.

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

Discussions similaires

  1. Demande d'aide sur requêtes SQL
    Par ZygoMatic74 dans le forum SQL
    Réponses: 3
    Dernier message: 26/02/2015, 23h27
  2. Demande d'aide pour requête sqlcmd
    Par ramben dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/11/2014, 14h54
  3. demande d'aide pour requête complexe avec SUM
    Par sibia dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/04/2013, 09h09
  4. [MySQL-5.5] Demande d'aide pour requête complexe
    Par gattou dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/04/2013, 10h29
  5. [SQL] Demande d'aide pour requète SQL
    Par vinco888 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/01/2009, 20h04

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