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 :

jointure de table a double condition sur un select


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de igorzup
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 307
    Par défaut jointure de table a double condition sur un select
    Bonjour,

    je dois croiser deux tableau ayant deux caracteristiques identique...

    et je ne vois plsu comment faire...

    quelque un saurais?

    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT     dbo.F_COMPTET.CT_Intitule, dbo.F_COMPTET.CT_Siret, dbo.F_ECRITUREC.EC_Date, dbo.F_ECRITUREC.EC_RefPiece, dbo.F_ECRITUREC.EC_Intitule, 
                          dbo.F_ECRITUREC.EC_Montant, dbo.F_ECRITUREC.EC_Sens, dbo.F_ECRITUREC.EC_Lettrage
    FROM         dbo.F_COMPTET LEFT OUTER JOIN
                          dbo.F_ECRITUREC ON dbo.F_COMPTET.CT_Num = dbo.F_ECRITUREC.CT_Num
    WHERE     (dbo.F_ECRITUREC.EC_Sens IS NOT NULL) AND (dbo.F_ECRITUREC.EC_Lettrage AND F_ECRITUREC.CT_Num IN
                              (SELECT     F_ECRITUREC_1.EC_Lettrage, F_ECRITUREC_1.CT_Num
                                FROM          dbo.F_COMPTET AS F_COMPTET_1 LEFT OUTER JOIN
                                                       dbo.F_ECRITUREC AS F_ECRITUREC_1 ON F_COMPTET_1.CT_Num = F_ECRITUREC_1.CT_Num
                                WHERE      (F_COMPTET_1.CT_Num LIKE '41LM%') AND (F_ECRITUREC_1.EC_Sens IS NOT NULL) AND (F_ECRITUREC_1.EC_Lettrage <> '') AND 
                                                       (F_ECRITUREC_1.EC_RefPiece = '5260122846')))
    regardez l'horreur que j'ai mise:
    au niveau de la jointure, avant le "IN" j'ai deux conditions qui doivent se retrouver dans le select suivant...

    merci d'avance

  2. #2
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Bon, comme tu l'as deviné, j'ai un peu de mal avec le gros bloc...
    Cela dit, le problème doit venir de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AND (dbo.F_ECRITUREC.EC_Lettrage AND F_ECRITUREC.CT_Num IN
                              (SELECT     F_ECRITUREC_1.EC_Lettrage, F_ECRITUREC_1.CT_Num
    Si tu veux l'existance 2 critères commun, en simplifiant, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM TableA A
    WHERE EXISTS (SELECT 1 FROM TableB B
                           WHERE A.col1 = B.col1
                               AND A.col2 = B.col2)
    Deuxième remarque :
    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A LEFT OUTER JOIN B
    WHERE B.col1 IS NOT NULL
    Tu peux simplifier en enlevant "LEFT OUTER" et la condition de NOT NULL...

  3. #3
    Membre éclairé Avatar de igorzup
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 307
    Par défaut
    trop fort ce pacman!

    continue les pacgum!

    (oups: merci!)

  4. #4
    Membre éclairé Avatar de igorzup
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 307
    Par défaut PTI DOUTE
    regarde ma requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT     dbo.F_COMPTET.CT_Intitule, dbo.F_COMPTET.CT_Siret, dbo.F_ECRITUREC.EC_Date, dbo.F_ECRITUREC.EC_RefPiece, dbo.F_ECRITUREC.EC_Intitule, 
                          dbo.F_ECRITUREC.EC_Montant, dbo.F_ECRITUREC.EC_Sens, dbo.F_ECRITUREC.EC_Lettrage
    FROM         dbo.F_COMPTET LEFT OUTER JOIN
                          dbo.F_ECRITUREC ON dbo.F_COMPTET.CT_Num = dbo.F_ECRITUREC.CT_Num
    WHERE     EXISTS
                              (SELECT     F_ECRITUREC_1.EC_Lettrage, F_ECRITUREC_1.CT_Num
                                FROM          dbo.F_COMPTET AS F_COMPTET_1 LEFT OUTER JOIN
                                                       dbo.F_ECRITUREC AS F_ECRITUREC_1 ON F_COMPTET_1.CT_Num = F_ECRITUREC_1.CT_Num
                                WHERE      (F_COMPTET_1.CT_Num LIKE '41LM%') AND (F_ECRITUREC_1.EC_Sens IS NOT NULL) AND (F_ECRITUREC_1.EC_Lettrage <> '') AND 
                                                       (F_ECRITUREC_1.EC_RefPiece = '5260122846') AND (dbo.F_ECRITUREC.EC_Lettrage = F_ECRITUREC_1.EC_Lettrage) AND 
                                                       (F_ECRITUREC.CT_Num = F_ECRITUREC_1.CT_Num))
    tu pense que je recupere que les lignes presentes dans les deux tables qui respectent les conditions?

  5. #5
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Je ne comprends pas très bien ta question...
    Si la requête ne te renvoie pas ce que tu attends, je te propose de nous donner un exemple concret de ce que tu attends, et de ce que tu as reçu à la place...

    Cela dit, quelques petits conseils :
    - Donne des alias à tes tables : ça rend le code plus lisible (plus d'énormes préfixes pour les colonnes) et en plus, c'est indispensable quand tu utilises plusieurs fois la même table. (ce que tu as fait du coup dans la sous requête)
    Ce n'est pas ce qu'il y a de plus "significatif", mais j'adore aliaser mes tables "a", "b", ... Mais je pense qu'on peut choisir un peu plus judicieusement les lettres

    - Ce qui est important dans la sous-requête EXISTS, c'est le fait de trouver une ligne. "SELECT d.EC_Lettrage, d.CT_Num" risque juste de te tromper...
    C'est pour ça que généralement on fait : SELECT 1
    => La partie déterminante est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AND (b.EC_Lettrage = d.EC_Lettrage) 
    AND (b.CT_Num = d.CT_Num))
    NOTE Supplémentaire : On fait SELECT 1 et non SELECT *, parce que ça permet à ton SGBD de ne pas rechercher des données dont il n'a pas besoin

    - Je réitère la remarque sur LEFT OUTER JOIN : ce n'est utile que lorsque tu cherches les lignes sans correspondance. Dans ton cas, c'est inutile...

    Allez, ça donne donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT a.CT_Intitule, a.CT_Siret, b.EC_Date, b.EC_RefPiece, b.EC_Intitule, b.EC_Montant, b.EC_Sens, b.EC_Lettrage
    FROM  dbo.F_COMPTET a JOIN dbo.F_ECRITUREC b
        ON a.CT_Num = b.CT_Num
    WHERE  EXISTS
    	(SELECT     1
    	FROM  dbo.F_COMPTET AS c JOIN dbo.F_ECRITUREC AS d 
    	  ON c.CT_Num = d.CT_Num
    	WHERE      (c.CT_Num LIKE '41LM%') 
    	  AND (d.EC_Sens IS NOT NULL) 
    	  AND (d.EC_Lettrage <> '') 
    	  AND (d.EC_RefPiece = '5260122846') 
    	  AND (b.EC_Lettrage = d.EC_Lettrage) 
    	  AND (b.CT_Num = d.CT_Num))

  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 pacmann Voir le message
    NOTE Supplémentaire : On fait SELECT 1 et non SELECT *, parce que ça permet à ton SGBD de ne pas rechercher des données dont il n'a pas besoin
    Exceptionnellement, dans le cas de EXISTS, un SGBD normalement constitué considère SELECT * comme une décoration, histoire de simplifier le travail de l'analyseur syntaxique. Donc EXISTS (SELECT 1 ...) ou EXISTS (SELECT * ...) c'est du pareil au même. C'est déjà comme cela que les choses étaient vues avec DB2, en 1984...

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

Discussions similaires

  1. Jointure de table avec champs calculé sur serveur lié
    Par Themacleod1980 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/04/2010, 15h57
  2. Plusieurs conditions sur une meme table (jointure)
    Par bugbug dans le forum Requêtes
    Réponses: 18
    Dernier message: 22/09/2009, 15h34
  3. Condition sur un select
    Par punky_brooster dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/11/2007, 18h31
  4. Double condition sur une date
    Par Olivier95 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 26/06/2006, 14h34
  5. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 16h03

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