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 :

Récupérer des nulls si la ligne n'existe pas dans la table liée


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Tech Lead
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Tech Lead
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 169
    Points
    169
    Par défaut Récupérer des nulls si la ligne n'existe pas dans la table liée
    Bonjour à tous,

    J'ai 2 tables :
    back_link_inc_ex_page
    Id_link_footer
    id_type_page
    type_link
    type_inc_ex
    et

    back_link_type_page
    id_type_page
    lib_fuseaction
    lib_type_page

    Les 2 tables sont liées par le champs id_type_page.
    Le but du jeu est de récupérer pour un ensemble de back_link_type_page la valeur du type_inc_ex qui peut être soit 'E' soit 'I' mais je dois également savoir si la ligne n'existe pas dans back_link_inc_ex_page, car il y a en fait un 3eme état que le précédent développeur n'a pas jugé bon de stocké qui est l'état 'N' mais qui est représenté dans la BDD par l'absence de la jointure.
    Le résultat de ce choix est que pour chaque back_link_type_page récupéré il doit requêter la BDD pour voir s'il y a une ligne ou non dans la table back_link_inc_ex_page. Et c'est ce que la requête que j'essaye de faire doit changer.

    Donc voici ce que j'ai pour le moment :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT BTP.ID_TYPE_PAGE, BTP.LIB_TYPE_PAGE, BIEP.TYPE_INC_EX, BIEP.ID_LINK_FOOTER, BIEP.TYPE_LINK
          FROM BACKLINK_INC_EX_PAGE BIEP
     LEFT JOIN BACKLINK_TYPE_PAGE BTP ON BTP.ID_TYPE_PAGE = BIEP.ID_TYPE_PAGE
         WHERE BTP.LIB_FUSEACTION NOT LIKE '%]'
           AND BIEP.TYPE_LINK = 'S'
           AND BIEP.ID_LINK_FOOTER = 367
      ORDER BY BIEP.ID_LINK_FOOTER ASC
    Le problème est que la jointure avec le left ne change rien car ce n'est pas la FK qui peut être nullable... et donc il ne me remonte que les entrées qui répondent à la condition de jointure.
    Je pense que Oracle est complètement capable de faire cette opération mais je ne vois pas comment réaliser cette chose...

    Merci d'avance pour toute l'aide apportée

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Points : 126
    Points
    126
    Par défaut
    Il manque le mot cle "Outer"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT BTP.ID_TYPE_PAGE, BTP.LIB_TYPE_PAGE, BIEP.TYPE_INC_EX, BIEP.ID_LINK_FOOTER, BIEP.TYPE_LINK
          FROM BACKLINK_INC_EX_PAGE BIEP
     LEFT OUTER JOIN BACKLINK_TYPE_PAGE BTP ON BTP.ID_TYPE_PAGE = BIEP.ID_TYPE_PAGE
         WHERE BTP.LIB_FUSEACTION NOT LIKE '%]'
           AND BIEP.TYPE_LINK = 'S'
           AND BIEP.ID_LINK_FOOTER = 367
      ORDER BY BIEP.ID_LINK_FOOTER ASC

  3. #3
    Membre habitué
    Homme Profil pro
    Tech Lead
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Tech Lead
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Points : 169
    Points
    169
    Par défaut
    Hello,

    Hélas ce n'est pas ça mais merci d'avoir essayé de me répondre.
    Finalement la réponse au problème est la condition de jointure :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT   T1.ID_TYPE_PAGE,
             T1.LIB_FUSEACTION,
             T2.TYPE_INC_EX,
             CASE WHEN T2.TYPE_INC_EX IS NULL THEN 'N' ELSE T2.TYPE_INC_EX END AS TES
    FROM     BACKLINK_TYPE_PAGE T1 LEFT JOIN PIX.BACKLINK_INC_EX_PAGE T2
                ON (T1.ID_TYPE_PAGE = T2.ID_TYPE_PAGE  AND T2.ID_LINK_FOOTER = 367)
    WHERE    SUBSTR (T1.LIB_FUSEACTION, -1, 1) <> ']';

    Il fallait donc tester si le champs dans la table d'en face était à null pour récupérer les lignes inexistantes et surtout ne pas mettre le test sur le ID_LINK_FOOTER dans le where mais dans la condition de jointure.
    Car le fait de le mettre dans le where me fait passer en INNER JOIN au lieu de rester en left.

    Merci à ceux qui ont jeté un cop d'oeil

  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 388
    Points
    18 388
    Par défaut
    Vous pouvez aussi utiliser la fonction COALESCE ou NVL pour remplacer votre CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(T2.TYPE_INC_EX, 'N') AS TES
    C'est plus court est c'est fait pour !

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

Discussions similaires

  1. Select un champ qui n'existe pas dans ma table
    Par Clermand dans le forum SQL
    Réponses: 1
    Dernier message: 08/04/2014, 16h21
  2. Afficher les lignes se trouvant pas dans une table
    Par Invité dans le forum Requêtes
    Réponses: 6
    Dernier message: 11/11/2011, 19h46
  3. Ajouter une ligne si elle n'existe pas dans la table
    Par daimadoshi dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/11/2010, 15h52
  4. [MySQL] extraire des données d'1 table t1 qui n'existent pas dans la table t2
    Par z_ahlam dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/11/2010, 18h07
  5. la selection d'un champ qui n'existe pas dans la table
    Par belaggoun2000 dans le forum Requêtes
    Réponses: 2
    Dernier message: 19/07/2010, 12h41

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