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 :

LEFT JOIN sur sous requete


Sujet :

Langage SQL

  1. #1
    Membre du Club Avatar de passie
    Inscrit en
    Février 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 56
    Points : 55
    Points
    55
    Par défaut LEFT JOIN sur sous requete
    Bonjour à tous,
    Je poste pour la suite de mon message d'hier http://http://www.developpez.net/for...d.php?t=166295
    mais la question précise étant résolue j'ajoute une nouvelle discussion
    Comme le titre l'indique, je cherche à faire une jointure externe sur une sous requete.
    Je m'explique : j'ai 3 tables

    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
    CREATE TABLE table1
    (
      date_p timestamp NOT NULL,
      valeur int8,
      CONSTRAINT table1_pkey PRIMARY KEY (date_p)
    ) 
    WITHOUT OIDS;
     
    CREATE TABLE table3
    (
      id_date serial NOT NULL,
      date_p timestamp,
      CONSTRAINT table3_pkey PRIMARY KEY (id_date)
    ) 
    WITH OIDS;
     
    CREATE TABLE table4
    (
      id_mes serial NOT NULL,
      id_date int4,
      id_instr int4,
      valeur float4,
      CONSTRAINT table4_pkey PRIMARY KEY (id_mes)
    ) 
    WITH OIDS;

    Je voudrai obtenir qlq chose de similaire à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT table1.date_p,table1.valeur,table2.valeur
    FROM table1
    LEFT JOIN table2
    ON table1.date_p=table2.date_p
    WHERE table1.date_p BETWEEN '2000-01-01' AND '2000-01-05'
    Sauf que cela ce complique je voudrai récupérer non plus table2.valeur mais table4.valeur
    du genre :

    2000-01-01 | T1v1 | null
    2000-01-02 | T1v2 | T4v1
    2000-01-03 | T1v3 | null
    2000-01-04 | T1v4 | T4v2
    2000-01-05 | T1v5 | T4v3


    en faisant qlq chose comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT table1.date_p,table1.valeur,table4.valeur
    FROM table1
    LEFT JOIN 
    (SELECT table3.date_p,table4.valeur
    FROM table4,table3
    WHERE table3.id_date = table4.id_date
    AND table3.date_p BETWEEN '2000-01-01' AND '2000-01-05'
    AND id_instr =1) as toto
    ON table1.date_p = table3.date_p
    WHERE table1.date_p BETWEEN '2000-01-01' AND '2000-01-05'
    mais bien sur cela ne fonctionne pas pour le moment
    suis je sur la bonne piste ??
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Ou tu en étais pas très loin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT T1.date_p, T1.valeur, T2.valeur
    FROM table1 T1
       LEFT JOIN (
          SELECT T3.date_p,T4.valeur
          FROM table4 T4
              INNER JOIN table3 T3
                 ON table3.id_date = table4.id_date
          WHERE T4.id_instr = 1
       ) T2
           ON T1.date_p = T2.date_p
    WHERE T1.date_p BETWEEN '2000-01-01' AND '2000-01-05'
    Le WHERE dans la sous-requête n'est pas nécessaire

    La requête principale ne connait pas la table3... elle connait uniquement sa sous-requête
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre du Club Avatar de passie
    Inscrit en
    Février 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 56
    Points : 55
    Points
    55
    Par défaut
    Merci Swoög

    Chez moi j'ai un soucis avec les clauses FROM de la requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT T1.date_p, T1.valeur, T2.valeur
    FROM table1 T1
       LEFT JOIN (
          SELECT T3.date_p,T4.valeur
          FROM table4 T4
              INNER JOIN table3 T3
                 ON table3.id_date = table4.id_date
          WHERE T4.id_instr = 1
       ) T2
           ON T1.date_p = T2.date_p
    WHERE T1.date_p BETWEEN '2000-01-01' AND '2000-01-05'
    Elle me renvoie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NOTICE:  Entrée manquante de la clause FROM dans la sous-requete pour la table «table3»
    NOTICE:  Entrée manquante de la clause FROM dans la sous-requete pour la table «table4»
     
    ERREUR:  La clause JOIN/ON se refere à  «table3», qui ne fait pas partie du JOIN

  4. #4
    Membre du Club Avatar de passie
    Inscrit en
    Février 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 56
    Points : 55
    Points
    55
    Par défaut
    Désolé autant pour moi j'ai reposté trop vite
    Il me suffisait de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT T1.date_p, T1.valeur, T2.valeur
    FROM table1 T1
       LEFT JOIN (
          SELECT T3.date_p,T4.valeur
          FROM table4 T4
              INNER JOIN table3 T3
                 ON T3.id_date = T4.id_date
          WHERE T4.id_instr = 1
       ) T2
           ON T1.date_p = T2.date_p
    WHERE T1.date_p BETWEEN '2000-01-01' AND '2000-01-05'
    Encore merci
    Je complique mes requêtes petit à petit avec les difficultés du débutant
    @+

  5. #5
    Membre du Club Avatar de passie
    Inscrit en
    Février 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 56
    Points : 55
    Points
    55
    Par défaut
    Ok c'est définitivement bon
    fin du post et encore merci

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

Discussions similaires

  1. [AC-97] left join avec sous requete
    Par Labotrain dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/10/2011, 13h55
  2. Left join sur requete (Projet Gestion de parc informatique)
    Par fomy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/03/2008, 20h39
  3. LEFT JOIN sur 2 BDD
    Par padawa dans le forum Outils
    Réponses: 1
    Dernier message: 07/04/2007, 13h40
  4. Combiner plusieurs LEFT JOIN dans une requète
    Par feanor12 dans le forum Access
    Réponses: 3
    Dernier message: 24/08/2006, 13h39
  5. INNER JOIN sur une requete UPDATE
    Par Immobilis dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/03/2006, 14h05

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