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 avec une composante NULL


Sujet :

Langage SQL

  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut Jointure avec une composante NULL
    Bonjour,

    Je suis en face d'un problème avec le NULL. Je dispose d'une table de liaison avec un clé composée :

    T_Correspondance = {#Id_Prestation, #Id_Ressource, Valeur}
    Id_Ressource y est NULLABLE.

    T_Activite = {Id_Activite, #Id_Prestation, #Id_Ressource, ...}
    Id_Ressource y est aussi NULLABLE.

    Mais comme NULL n'est pas égal à NULL, quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM T_Activite 
    	INNER JOIN Correspondance 
    		ON Correspondance .Id_Prestation = T_Activite.Id_Prestation
    		AND T_Activite.Id_Ressource = Correspondance .Id_Ressource
    Je n'ai pas les résultat pour lesquels les Id_Prestation sont égaux et les Id_Ressource NULL.

    Je comprends que NULL est l'absence de valeur et que NULL n'est pas égal à NULL mais comment alors faire pour répondre à mon besoin ?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Je pourrais utiliser du coalesce(...) = coalesce (...) mais c'est pas joli non ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Quel est ton SGBD ?

    Sur Oracle, par exemple, tu peux enrober tes jointures d'un NVL(Id_Ressource, 0) pour contourner le problème.
    Attention au perfs, car ça fait sauter l'utilisation d'un éventuel index, mais bon ça dépanne bien.

    Sue les autres SGBD, je suppose qu'il existe des fonctions équivalentes pour substituer une chaîne de caractère à une autre.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Mon SGBD est SQL Server mais je voulais évoquer le problème en général. Effectivement je peux "dénullifier" mais comme tu le dis, ça compromet peut être certaines optimisations.

    Je vais faire comme ça en attendant mais j'aimerais bien avoir l'avis d'autres personnes sur la question.

  5. #5
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Bonjour,

    le problème est plus simple qu'il n'y paraît : tu veux que la jointure se fasse lorsque les deux champs sont égaux... ou lorsqu'ils sont tous les deux NULL.
    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM T_Activite 
    	INNER JOIN Correspondance 
    		ON Correspondance.Id_Prestation = T_Activite.Id_Prestation
    		AND (T_Activite.Id_Ressource = Correspondance.Id_Ressource OR (T_Activite.Id_Ressource IS NULL AND Correspondance.Id_Ressource IS NULL))

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Citation Envoyé par J1 Voir le message
    Bonjour,

    le problème est plus simple qu'il n'y paraît : tu veux que la jointure se fasse lorsque les deux champs sont égaux... ou lorsqu'ils sont tous les deux NULL.
    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM T_Activite 
    	INNER JOIN Correspondance 
    		ON Correspondance.Id_Prestation = T_Activite.Id_Prestation
    		AND (T_Activite.Id_Ressource = Correspondance.Id_Ressource OR (T_Activite.Id_Ressource IS NULL AND Correspondance.Id_Ressource IS NULL))
    Hum... Ca sent le produit cartésien ça !

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Citation Envoyé par J1 Voir le message
    Bonjour,

    le problème est plus simple qu'il n'y paraît : tu veux que la jointure se fasse lorsque les deux champs sont égaux... ou lorsqu'ils sont tous les deux NULL.
    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM T_Activite 
    	INNER JOIN Correspondance 
    		ON Correspondance.Id_Prestation = T_Activite.Id_Prestation
    		AND (T_Activite.Id_Ressource = Correspondance.Id_Ressource OR (T_Activite.Id_Ressource IS NULL AND Correspondance.Id_Ressource IS NULL))
    Effectivement ! Plus simple qu'il n'y parait !

    Je teste ça demain, mais à priori j'ai ma réponse.

  8. #8
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    Hum... Ca sent le produit cartésien ça !
    Et pourtant, ça n'en est pas un !
    Plus sérieusement, simple curiosité : qu'est-ce qui te faisait craindre un produit cartésien ?

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Ca me fait quand même bien marrer de m'être torturé alors que c'était si simple

  10. #10
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par J1 Voir le message
    Et pourtant, ça n'en est pas un !
    Plus sérieusement, simple curiosité : qu'est-ce qui te faisait craindre un produit cartésien ?
    Le fait que si tu as plusieurs enregistrement nuls dans les tables correspondance et T_activite ils te ramene l'ensemble des possibilité

    Correspondance : T_activite
    Null (1) Null (3)
    Null (2) Null (4)



    Tu auras (1)-(3), (1)-(4) , (2)-(3) , et (2)-(4) , non ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    miloux32 t'a illustré ce qui me fait craindre un produit cartésien...

    Et j'ai envie de te renvoyer à la signature de miloux32, en gras et en vert...

  12. #12
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par miloux32 Voir le message
    Le fait que si tu ais plusieurs enregistrement nuls dans les tables correspondance et T_activite ils te ramene l'ensemble des possibilité

    Correspondance : T_activite
    Null (1) Null (3)
    Null (2) Null (4)



    Tu auras (1)-(3), (1)-(4) , (2)-(3) , et (2)-(4) , non ?
    Citation Envoyé par dgi77 Voir le message
    miloux32 t'a illustré ce qui me fait craindre un produit cartésien...

    Et j'ai envie de te renvoyer à la signature de miloux32, en gras et en vert...
    L'exemple de miloux32 est en effet parlant : c'est le résultat de la mise en correspondance des lignes dont le champ de jointure est NULL... ce qui n'est autre que le principe même d'une jointure (portant ici sur le NULL).

    Quant à la signature de miloux32, je suis plus que d'accord avec !
    Néanmoins, ce n'est pas parce que ça marche que ce n'est pas bon !

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

Discussions similaires

  1. [Débutant] LINQ to SQL, jointure avec une valeur potentiellement null
    Par gunth dans le forum Linq
    Réponses: 5
    Dernier message: 23/07/2013, 09h57
  2. besoin d'aide pour une jointure avec une exclusion
    Par manu_71 dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/02/2007, 11h22
  3. [PostgreSQL 8.1] Problème de jointures avec une Fk null
    Par Reward dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/11/2006, 08h25
  4. [Oracle] jointures avec une somme sur deux champs
    Par guggus dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/10/2006, 17h06
  5. Réponses: 1
    Dernier message: 18/01/2006, 17h51

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