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

PL/SQL Oracle Discussion :

Question bête sur les jointures ?


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    En formation
    Inscrit en
    Septembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Septembre 2015
    Messages : 15
    Par défaut Question bête sur les jointures ?
    Bonjour,

    Voilà j'ai une question bête je voudrais savoir pourquoi ces requêtes fonctionnent :

    Contexte :Lister les articles les moins chers (basés sur VENTE.PRIX1) que le moins cher des articles dont le VENTE.CODART commence par R, afficher le PRODUIT.LIBART et le VENTE.PRIX1)

    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select P1.LIBART, V1.PRIX1
    FROM VENTE V1, PRODUIT P1
    where V1.PRIX1 < 
    (Select MIN(V1.PRIX1) from VENTE v1 where V1.CODART like 'R%')
    and V1.CODART = P1.CODART
    GROUP BY P1.LIBART, V1.PRIX1
    2/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select Distinct P1.LIBART, V1.PRIX1
    FROM VENTE V1, PRODUIT P1
    where V1.PRIX1 < 
    (Select MIN(V1.PRIX1) from VENTE v1 where V1.CODART like 'R%')
    and V1.CODART = P1.CODART

    Alors que celle là, avec une jointure (qui à la base me semblait la plus logique)

    3/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Select V1.LIBART, V1.PRIX1
    FROM VENTE V1
    where V1.PRIX1 < 
    (Select MIN(V1.PRIX1) from VENTE v1 where V1.CODART like 'R%')
    INNER JOIN
    PRODUIT P1
    on V1.CODART = P1.CODART
    GROUP BY V1.LIBART, V1.PRIX1
    Merci par avance pour vos lumière et votre indulgence

    Ben

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 246
    Par défaut
    Je dirais à priori parce que ta jointure est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (Select MIN(V1.PRIX1) from VENTE v1 where V1.CODART like 'R%')
    INNER JOIN
    PRODUIT P1
    on V1.CODART = P1.CODART
    Par contre, cette requête-ci devrait marcher (c'est l'équivalent en jointure explicite de la première requête)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select V1.LIBART, V1.PRIX1
    FROM VENTE V1
    INNER JOIN PRODUIT P1 on V1.CODART = P1.CODART
    where V1.PRIX1 < 
    (Select MIN(V1.PRIX1) from VENTE v1 where V1.CODART like 'R%')
    GROUP BY V1.LIBART, V1.PRIX1

  3. #3
    Membre averti
    Homme Profil pro
    En formation
    Inscrit en
    Septembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Septembre 2015
    Messages : 15
    Par défaut
    Je viens de l'executer dans SQL DEV et il me sort une erreur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select V1.LIBART, V1.PRIX1
    FROM VENTE V1
    INNER JOIN PRODUIT P1 on V1.CODART = P1.CODART
    where V1.PRIX1 < 
    (Select MIN(V1.PRIX1) from VENTE v1 where V1.CODART like 'R%')
    GROUP BY V1.LIBART, V1.PRIX1

    ORA-00904: "V1"."LIBART" : identificateur non valide
    00904. 00000 - "%s: invalid identifier"
    *Cause:
    *Action:
    Erreur à la ligne 163, colonne 10


    Petite précision la donnée LIBART se situe dans la table PRODUIT, mais vu qu'on a affaire à une jointure selon moi ça devrait passer. . .

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 246
    Par défaut
    Citation Envoyé par Benji1986 Voir le message
    Petite précision la donnée LIBART se situe dans la table PRODUIT, mais vu qu'on a affaire à une jointure selon moi ça devrait passer. . .
    Donc c'est pas V1.LIBART, mais P1.LIBART
    Dans le select et dans le group by

  5. #5
    Membre averti
    Homme Profil pro
    En formation
    Inscrit en
    Septembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : En formation

    Informations forums :
    Inscription : Septembre 2015
    Messages : 15
    Par défaut
    Super ça fonctionne, donc si j'ai bien compris, la jointure doit se faire avant le WHERE, d'ailleurs je ne savais pas qu'on pouvait mettre un where après une jointure , j'ai toujours vu dans les différents docs que j'ai vu des trucs de la forme basique Select/From/Where, donc je pensais que c'était impossible...

    Bref j'ai encore du taff ! Vous n'avez pas fini de me voir sur le forum

    Merci beaucoup !!!!!!!!!

    Ben

  6. #6
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 246
    Par défaut
    La jointure se fait entre les éléments immédiatement à gauche et immédiatement à droite du mot clé JOIN (et ses déclinaisons, INNER, LEFT, RIGHT, etc).

    Ensuite, la forme FROM VENTE V1, PRODUIT P1 est ce que l'on appelle une jointure implicite. C'est la même chose que le INNER JOIN mais en beaucoup moins lisible, avec les condition de jointure dans le Where ou carrément absente (là on laisse le SGBD se démerder).

    Malheureusement cette forme est encore très largement enseignée, et, en plus, bien souvent pour aborder le sujet des jointures.
    Pour ma part, je fais partie de ceux qui pensent que cette forme devrait purement et simplement être interdite car non seulement grande source d'erreurs et de mauvaises compréhensions du fonctionnement des jointures par les débutants, mais aussi sources de bugs et de difficultés de compréhension des requêtes en production.
    De plus, pour moi, le Where, c'est une clause pour filtrer, écrémer les résultats obtenus par la requête. Ce n'est pas dans le Where que devrait se trouver les conditions d’exécution de la requête.

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

Discussions similaires

  1. Question bête sur les ancres
    Par zooffy dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/01/2008, 14h28
  2. question bête sur les binaires
    Par ben_skywalker dans le forum Access
    Réponses: 4
    Dernier message: 01/06/2006, 11h29
  3. Question bête sur les conteneurs
    Par jadey dans le forum C++
    Réponses: 21
    Dernier message: 04/05/2006, 00h09
  4. [VB6]Question bête sur les paramètres optionels
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/10/2005, 20h33
  5. [MFC] Question bête sur les CListBox
    Par gwendo dans le forum MFC
    Réponses: 1
    Dernier message: 10/08/2005, 16h43

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