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

Requêtes MySQL Discussion :

RIGHT JOIN dans une sous requete


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut RIGHT JOIN dans une sous requete
    Bonjour,
    Je sollicite votre aide pour une question de débutant qui concerne l'utilisation du RIGHT JOIN.
    Une erreur m'est retournée sur la syntaxe d'écriture du RIGHT JOIN.
    Pouvez-vous m'aider please ?

    A votre dispo.
    Merci d'avance pour votre aide.

    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
    select v_jfd.CP1 COMPTE_PAIEMENT, v_jfd.J_date1 DATE, v_jfd.FINANCEMENT_DEBIT,  v_jc.COMMISSIONS /*, v_jfc.FINANCEMENT_CREDIT*/  from
    (select coh1.ACCOUNT_ID CP1, DATE_FORMAT(coh1.CREATION_DATE , "%d/%m/%Y") J_date1, SUM(coh1.EXPECTED_OPERATION_AMOUNT) FINANCEMENT_DEBIT
    	from CONTRACT_OPERATIONS_HISTORY coh1 
    	where coh1.RECORD_TYPE in ('vacation-reglement-transactions')
    	and DATE_FORMAT(coh1.CREATION_DATE , "%d/%m/%Y")  = DATE_FORMAT(sysdate(), "%d/%m/%Y")
    	and coh1.ACTIVITY_ID = 'crediter-reglement-sur-compte-paiement' and coh1.EXPECTED_OPERATION_AMOUNT > 0
    group by coh1.ACCOUNT_ID, DATE_FORMAT(coh1.CREATION_DATE , "%d/%m/%Y")) v_jfd,
    (select coh2.ACCOUNT_ID CP2, DATE_FORMAT(coh2.CREATION_DATE , "%d/%m/%Y") J_date2, SUM(coh2.EXPECTED_OPERATION_AMOUNT) COMMISSIONS
    	from CONTRACT_OPERATIONS_HISTORY coh2 
    	where coh2.RECORD_TYPE in ('vacation-reglement-transactions')
    	and DATE_FORMAT(coh2.CREATION_DATE , "%d/%m/%Y")  = DATE_FORMAT(sysdate(), "%d/%m/%Y")
    	and coh2.ACTIVITY_ID = 'debiter-commission-sur-compte-paiement' 
    	group by coh2.ACCOUNT_ID, DATE_FORMAT(coh2.CREATION_DATE , "%d/%m/%Y")) v_jc ,
    (select coh3.ACCOUNT_ID CP3, DATE_FORMAT(coh3.CREATION_DATE , "%d/%m/%Y") J_date3, SUM(coh3.EXPECTED_OPERATION_AMOUNT) FINANCEMENT_CREDIT
    	from CONTRACT_OPERATIONS_HISTORY coh3
    	where coh3.RECORD_TYPE in ('vacation-reglement-transactions')
    	and DATE_FORMAT(coh3.CREATION_DATE , "%d/%m/%Y")  = DATE_FORMAT(sysdate(), "%d/%m/%Y")
    	and coh3.ACTIVITY_ID = 'crediter-reglement-sur-compte-paiement' and coh3.EXPECTED_OPERATION_AMOUNT < 0
    	group by coh3.ACCOUNT_ID, DATE_FORMAT(coh3.CREATION_DATE , "%d/%m/%Y")) v_jfc 
    where v_jfd.J_date1=v_jc.J_date2 
    and v_jfd.J_date1=v_jfc.J_date3
    and v_jfd.CP1= v_jc.CP2
    -- and v_jfd.CP1= v_jfc.CP3  => NE CONVIENT PAS, je n'obtiens que les résultats en commun de v_jfd et v_jfc, je veux remplacer cette condition par un RIGHT JOIN
    RIGHT OUTER JOIN v_jfc ON v_jfd.CP1 = v_jfc.CP3
    order by v_jfd.CP1

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    En cas d'erreur, ce serait bien de nous donner le message en question...
    Cela dit les messages d'erreur de MySQL ne sont pas toujours très parlants.
    Ici ton problème ne vient pas des sous-requête, mais du "placement" de la jointure dans la requête.
    Sa structure peut se résumer à ceci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select a,b,c
    from x
    where u=p
    right join y on ...
    On voit bien que la jointure est mal placée, elle doit être avant la clause WHERE, et non après.
    Peut-être manque t'il une parenthèse, sinon il faut remonter la jointure.

    Tatayo.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour Tatayo,
    En effet, l'erreur retournée n'est pas parlante:
    SQL Error [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'RIGHT OUTER JOIN v_jfc ON v_jfd.CP1 = v_jfc.CP3
    order by v_jfd.CP1' at line 25

    Je n'arrive pas à comprendre ton retour:
    - Ok, je comprends que le RIGHT JOIN est mal placé.
    - Tu me dis que dans mon cas, la jointure RIGHT JOIN est placée après la clause where, elle doit être avant :

    MON CAS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    where v_jfd.J_date1=v_jc.J_date2 
    and v_jfd.J_date1=v_jfc.J_date3
    and v_jfd.CP1= v_jc.CP2
    -- and v_jfd.CP1= v_jfc.CP3  => NE CONVIENT PAS, je n'obtiens que les résultats en commun de v_jfd et v_jfc, je veux rempalcer cette condition par un RIGHT JOIN
    RIGHT OUTER JOIN v_jfc ON v_jfd.CP1 = v_jfc.CP3
    TON EXEMPLE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where u=p
    right join y on ...
    Très sincèrement, je ne comprends pas ce que ca veut dire.
    Peux-tu me me détailler un peu plus stp ?

    D'avance merci.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Je t'ai donné la syntaxe générale d'une requête, avec l'enchainement des différentes clauses.
    Dans ta requête il faut déplacer la jointure avant la clause WHERE, tout simplement.

    Tatayo

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Tatayo,
    Si je déplace le RIGHT JOIN avant la WHERE clause, j'obtiens le message d'erreur ci-dessous:

    SQL Error [1146] [42S02]: Table 'EPDATAP.v_jfc' doesn't exist

    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
    select v_jfd.CP1 COMPTE_PAIEMENT, v_jfd.J_date1 DATE, v_jfd.FINANCEMENT_DEBIT,  v_jc.COMMISSIONS /*, v_jfc.FINANCEMENT_CREDIT*/  from
    (select coh1.ACCOUNT_ID CP1, DATE_FORMAT(coh1.CREATION_DATE , "%d/%m/%Y") J_date1, SUM(coh1.EXPECTED_OPERATION_AMOUNT) FINANCEMENT_DEBIT
    	from CONTRACT_OPERATIONS_HISTORY coh1 
    	where coh1.RECORD_TYPE in ('vacation-reglement-transactions')
    	and DATE_FORMAT(coh1.CREATION_DATE , "%d/%m/%Y")  = DATE_FORMAT(sysdate(), "%d/%m/%Y")
    	and coh1.ACTIVITY_ID = 'crediter-reglement-sur-compte-paiement' and coh1.EXPECTED_OPERATION_AMOUNT > 0
    group by coh1.ACCOUNT_ID, DATE_FORMAT(coh1.CREATION_DATE , "%d/%m/%Y")) v_jfd,
    (select coh2.ACCOUNT_ID CP2, DATE_FORMAT(coh2.CREATION_DATE , "%d/%m/%Y") J_date2, SUM(coh2.EXPECTED_OPERATION_AMOUNT) COMMISSIONS
    	from CONTRACT_OPERATIONS_HISTORY coh2 
    	where coh2.RECORD_TYPE in ('vacation-reglement-transactions')
    	and DATE_FORMAT(coh2.CREATION_DATE , "%d/%m/%Y")  = DATE_FORMAT(sysdate(), "%d/%m/%Y")
    	and coh2.ACTIVITY_ID = 'debiter-commission-sur-compte-paiement' 
    	group by coh2.ACCOUNT_ID, DATE_FORMAT(coh2.CREATION_DATE , "%d/%m/%Y")) v_jc ,
    (select coh3.ACCOUNT_ID CP3, DATE_FORMAT(coh3.CREATION_DATE , "%d/%m/%Y") J_date3, SUM(coh3.EXPECTED_OPERATION_AMOUNT) FINANCEMENT_CREDIT
    	from CONTRACT_OPERATIONS_HISTORY coh3
    	where coh3.RECORD_TYPE in ('vacation-reglement-transactions')
    	and DATE_FORMAT(coh3.CREATION_DATE , "%d/%m/%Y")  = DATE_FORMAT(sysdate(), "%d/%m/%Y")
    	and coh3.ACTIVITY_ID = 'crediter-reglement-sur-compte-paiement' and coh3.EXPECTED_OPERATION_AMOUNT < 0
    	group by coh3.ACCOUNT_ID, DATE_FORMAT(coh3.CREATION_DATE , "%d/%m/%Y")) v_jfc 
    RIGHT OUTER JOIN v_jfc ON v_jfd.CP1 = v_jfc.CP3
    where v_jfd.J_date1=v_jc.J_date2 
    and v_jfd.J_date1=v_jfc.J_date3
    and v_jfd.CP1= v_jc.CP2
    -- and v_jfd.CP1= v_jfc.CP3  => NE CONVIENT PAS, je n'obtiens que les résultats en commun de v_jfd et v_jfc, je veux rempalcer cette condition par un RIGHT JOIN
    order by v_jfd.CP1
    Encore merci pour ton aide.

  6. #6
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    La syntaxe SQL de base c'est INNER JOIN, LEFT JOIN, RIGHT JOIN entre 2 tables
    suivi des liaisons avec le mot clef ON
    ensuite si le ça porte sur une condition particulière on ajoute un WHERE

    Le mélange liaisons et conditions dans le WHERE c'est du passé ... et mettre un INNER JOIN, RIGHT, LEFT dans le WHERE ... on oublie ...


    SYNTAXE ex1 : je veux des infos de commande et detailscommande car dans ma base je n'ai pas autorisé la création de commande sans qu'au moins une ligne detailscommande n'ait été créée
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select C.x, D.y from commande C INNER JOIN detailscommande D
    ON C.id = D.idcommande
    WHERE C.numerocommande = 928
    SYNTAXE ex2 : je veux des infos de commande que le detailscommande existe ou pas car dans ma base il peut y avoir une commande sans ligne detailscommande

    Si on veut les infos de la commande même si il n'y a rien dans le détails on peut utiliser un RIGHT ou LEFT JOIN
    Dans les cas suivants si le détail n'existe pas -> dans D.y on aura un NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select C.x, D.y from commande C LEFT JOIN detailscommande D
    ON C.id = D.idcommande
    WHERE C.numerocommande = 928
    <=>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select C.x, D.y from detailscommande D RIGHT JOIN commande C 
    ON C.id = D.idcommande
    WHERE C.numerocommande = 928

    Là dans notre cas les liaisons/conditions sont mal placées !?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select v_jfd.CP1 COMPTE_PAIEMENT, v_jfd.J_date1 DATE, v_jfd.FINANCEMENT_DEBIT,  v_jc.COMMISSIONS /*, v_jfc.FINANCEMENT_CREDIT*/  from
    (...) v_jfd,
    (...) v_jc ,
    (...) v_jfc 
    RIGHT OUTER JOIN v_jfc ON v_jfd.CP1 = v_jfc.CP3
    where v_jfd.J_date1=v_jc.J_date2 
    and v_jfd.J_date1=v_jfc.J_date3
    and v_jfd.CP1= v_jc.CP2
    order by v_jfd.CP1

    On attendrait donc plutôt ce genre avec ce qui lient les tables entre elles ...
    et les conditions sur les dates dans le WHERE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select v_jfd.CP1 COMPTE_PAIEMENT, v_jfd.J_date1 DATE, v_jfd.FINANCEMENT_DEBIT,  v_jc.COMMISSIONS /*, v_jfc.FINANCEMENT_CREDIT*/  from
    (...) v_jfd INNER/RIGHT/LEFT JOIN (...) v_jc 
    ON ...
    INNER/RIGHT/LEFT JOIN (...) v_jfc 
    ON ...
    where ...

    Maintenant restera un soucis, ci-dessous la condition porte maintenant sur une ligne détailscommande qui peut ne pas exister
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select C.x, D.y from commande C LEFT JOIN detailscommande D
    ON C.id = D.idcommande
    WHERE D.y = "macondition"
    alors dans ce cas là on pourra plutôt employer cette syntaxe, qui mélange liaisons et conditions mais dans le ON
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select C.x, D.y from commande C LEFT JOIN detailscommande D
    ON C.id = D.idcommande
         and D.y = "macondition"
    Est-ce plus clair ?
    Pour les spécialistes SQL qui passeraient sur mon post, merci de confirmer (ou non) mes dires je ne voudrais pas raconter de bêtises même le Dimanche
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Salut Vttman,
    Merci pour tes explications qui m'ont permis de comprendre et mettre en oeuvre.
    Bonne journée.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par vttman Voir le message
    La syntaxe SQL de base c'est INNER JOIN, LEFT JOIN, RIGHT JOIN entre 2 tables
    suivi des liaisons avec le mot clef ON ...
    Pas que... sous forme de schéma de Backus-Naur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ INNER ] JOIN
    | {LEFT | RIGHT | FULL } [ OUTER ] JOIN
    | NATURAL [ INNER ] JOIN [ USING <liste_colonne> ]
    | NATURAL  {LEFT | RIGHT | FULL } [ OUTER ] JOIN [ USING <liste_colonne> ]
    | CROSS JOIN
    | UNION JOIN
    La NATURAL étant à proscrire absolument !

    Il faut lire mes bouquins sur SQL !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. parametre dans une sous requete
    Par ericpremier dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/10/2009, 15h35
  2. Réponses: 12
    Dernier message: 01/10/2009, 15h30
  3. LEFT rt RIGHT JOIN dans la même requete
    Par estampille dans le forum Requêtes
    Réponses: 3
    Dernier message: 30/07/2008, 12h35
  4. 'Limit' ne marche pas dans une sous requete !?
    Par walou dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/09/2007, 13h06
  5. Réponses: 13
    Dernier message: 27/08/2007, 12h16

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