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

SQL Oracle Discussion :

Requête liant deux tables (avec jointure externe)


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut Requête liant deux tables (avec jointure externe)
    Bonjour j'ai une requête assez compliquée qui ne fonctionne pas tout à fait bien :
    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
    select 
    lot.DTCREAT_DT  || ';' || lot.nb03  || ';' || lot.libelle_20_12  || ';' || lot.libelle_20_10  || ';' || lot.libelle_20_11  || ';' || 
    g.nom  || ';' || v.nom  || ';' || refimage  || ';' || lot.LIBELLE_100_5  || ';' || lot.LIBELLE_20_9   || ';' || lot.gpicptrib
      || ';' || vente.date3_dt  || ';' || lot.GPIDEPOT  || ';' || lot.GPIVOLUME  || ';' || lot.GPIVILLETRIB 
    from g_individu v,g_individu g,g_piece lot,g_information vente
    where vente.refinfo = lot.gpirole 
    and lot.refimage=v.refindividu 
    and lot.typpiece='LOT' 
    and v.qualite='VENDEUR'
    and g.qualite='CLIENT' 
    and g.refindividu=lot.libelle_20_11
    and vente.refinfo is not null 
    and lot.libelle_20_12 not in ('EXPEDIE')
    and lot.GPIDEPOT = 'I'
    and lot.DTCREAT_DT > '01/10/2007'
    De la sorte, lorsque le champ "lot.libelle_20_11" est null, l'enregistrement ne ressort pas.

    Or j'aimerais que même si le champ "lot.libelle_20_11" est null, l'enregistrement ressorte avec comme valeur null pour le champ "g.nom"


    C'est un peu complexe donc je simplifie le problème :

    J'ai deux Table T1 (a1, b1, c1, d1, etc) et T2 (a2, b2, c2, d2, etc) reliées par les champs T1.a1 et T2.a2

    J'ai obtenir les les infos T1.a1, T1.b1, T2.b2 dans le cas ou T1.a1 = T2.a2
    mais aussi dans le cas T1.a1 est null (dans ce cas, j'aimerais que T2.b2 s'affiche null)
    est ce que cette requête pourrait fonctionner?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select T1.a1, T1.b1, T2.b2
    from  T1, T2
    where T1.A1 = T2.A2
    or T1.a1 is null
    est-ce que c'est compréhensible ?

    Merci d'avance....

  2. #2
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Bonjour,

    Il faut que tu utilises une jointure externe. Elle permet de faire exactement ce tu tu veux:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT 
    lot.DTCREAT_DT  || ';' || lot.nb03  || ';' || lot.libelle_20_12  || ';' || lot.libelle_20_10  || ';' || lot.libelle_20_11  || ';' || 
    g.nom  || ';' || v.nom  || ';' || refimage  || ';' || lot.LIBELLE_100_5  || ';' || lot.LIBELLE_20_9   || ';' || lot.gpicptrib
      || ';' || vente.date3_dt  || ';' || lot.GPIDEPOT  || ';' || lot.GPIVOLUME  || ';' || lot.GPIVILLETRIB 
    FROM g_individu v,g_individu g,g_piece lot,g_information vente
    WHERE vente.refinfo = lot.gpirole 
    AND lot.refimage=v.refindividu 
    AND lot.typpiece='LOT' 
    AND v.qualite='VENDEUR'
    AND g.qualite(+)='CLIENT' 
    AND g.refindividu(+)=lot.libelle_20_11
    AND vente.refinfo IS NOT NULL 
    AND lot.libelle_20_12 NOT IN ('EXPEDIE')
    AND lot.GPIDEPOT = 'I'
    AND lot.DTCREAT_DT > '01/10/2007'
    Le principe consiste à mettre un (+) du côté où il manque la donnée. Par contre, il faut alors le mettre sur toutes les colonnes de jointure.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 117
    Points : 44
    Points
    44
    Par défaut
    C'est exactement ce qu'il me fallait!

    Merci beaucoup

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 380
    Points
    18 380
    Par défaut
    Je vous encourage à :
    1. utiliser les jointures ANSI
    2. utiliser égal / différent au lieu de in / not in quand il n'y a qu'un seul argument
    3. comparer des dates avec des dates

    Votre requête deviendrait :
    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
    SELECT 
    lot.DTCREAT_DT  || ';' || lot.nb03  || ';' || lot.libelle_20_12  || ';' || lot.libelle_20_10  || ';' || lot.libelle_20_11  || ';' || 
    g.nom  || ';' || v.nom  || ';' || refimage  || ';' || lot.LIBELLE_100_5  || ';' || lot.LIBELLE_20_9   || ';' || lot.gpicptrib
      || ';' || vente.date3_dt  || ';' || lot.GPIDEPOT  || ';' || lot.GPIVOLUME  || ';' || lot.GPIVILLETRIB 
    FROM
        g_piece lot
        INNER JOIN g_information vente
          ON vente.refinfo = lot.gpirole
        INNER JOIN g_individu v
          ON v.refindividu = lot.refimage
        LEFT OUTER JOIN g_individu g
          ON g.refindividu = lot.libelle_20_11
         AND g.qualite = 'CLIENT'
    WHERE
        lot.typpiece = 'LOT' 
    AND v.qualite = 'VENDEUR'
    AND vente.refinfo IS NOT NULL 
    AND lot.libelle_20_12 <> 'EXPEDIE'
    AND lot.GPIDEPOT = 'I'
    AND lot.DTCREAT_DT > to_date('01/10/2007', 'dd/mm/yyyy')

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

Discussions similaires

  1. [PDO] PDO et requête ayant des tables avec jointures
    Par ninouee dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/10/2014, 09h34
  2. Requête sur deux tables avec fonction COUNT
    Par islande dans le forum Langage SQL
    Réponses: 13
    Dernier message: 12/08/2013, 16h06
  3. Réponses: 4
    Dernier message: 07/07/2011, 08h51
  4. sql requête sur deux tables avec cumul..
    Par Chris'S dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/01/2010, 23h23
  5. Réponses: 1
    Dernier message: 11/06/2009, 23h39

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