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 :

Requete avec LEFT OUTER JOIN et perte de résultats


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 194
    Points : 93
    Points
    93
    Par défaut Requete avec LEFT OUTER JOIN et perte de résultats
    Bonjour à tous,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT TB1.Champ1, TB2.Champ2 FROM TB1 LEFT OUTER JOIN TB2 ON TB1.Id=TB2.Id WHERE TB2.Id IS NULL
    Partant de l'idée que tous les enregistrements de TB2 ont un Id.
    Pourquoi aucun enregistrement de TB1 n'apparait ?
    Alors que je fais un LEFT OUTER JOIN ?

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Si tous les champs de la table TB2 ont un id pourquoi tu demande ce qui sont NULL ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 194
    Points : 93
    Points
    93
    Par défaut
    En fait j'ai simplifié un problème plus global dans une requête beaucoup plus longue qui m'oblige à faire ceci OR r1.ResaFin IS NULL OR r1.ResaFin IS NOT NULL pour éviter de perdre les appartements inexistants dans la table reservation ou dans la table reservation mais hors des filtres.

    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
     
    SELECT a.AppartId, MIN(r1.ResaFin) as Debut, MIN(r2.ResaDebut) as Fin FROM appartement a LEFT OUTER JOIN reservation r1 ON a.AppartId=r1.AppartId
    LEFT OUTER JOIN reservation r2 ON a.AppartId=r2.AppartId
     
    WHERE 
    (
    a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-08-29' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-08-30' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-08-31' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-09-01' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-09-02' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-09-03' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-09-04' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-09-05' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-09-06' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-09-07' BETWEEN ResaDebut AND ResaFin)
    OR a.AppartId NOT IN (SELECT r.AppartId FROM reservation r WHERE '2008-09-08' BETWEEN ResaDebut AND ResaFin)
    )
     
    AND (r1.ResaFin <= '2008-09-08' AND r1.ResaFin >='2008-08-28' AND r2.ResaDebut >= '2008-08-28')
    OR r1.ResaFin IS NULL OR r1.ResaFin IS NOT NULL
     
    GROUP BY a.AppartId
    ORDER BY Debut, Fin

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 194
    Points : 93
    Points
    93
    Par défaut
    En fait, ceux qui sont NULL sont ceux qui n'existent pas dans TB2.
    (pas de clef étrangère correspond à l'Id de TB1).

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 194
    Points : 93
    Points
    93
    Par défaut
    Ce que je cherche à faire.
    C'est avoir systématiquement les enregistrements de TB1
    et les champs de TB2 à vide lorsqu'il n'y a pas de données ou lorsque les enregistrements de TB2 ne correspondent pas aux filtres (clause WHERE).

    Quelqu'un a une idée ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par webtheque Voir le message
    Ce que je cherche à faire.
    C'est avoir systématiquement les enregistrements de TB1
    et les champs de TB2 à vide lorsqu'il n'y a pas de données ou lorsque les enregistrements de TB2 ne correspondent pas aux filtres (clause WHERE).
    C'est précisément ce que fait le left outer join.
    Simplement, dans ton exemple, tu appliques la clause WHERE à toute ta requete, pas seulement à la table TB2.

    Cette requête devrait te renvoyer ce que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TB1.Champ1, TB2.Champ2 FROM TB1 LEFT OUTER JOIN (select * from TB2 WHERE TB2.Id IS NULL) TB2 ON TB1.Id=TB2.Id

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 194
    Points : 93
    Points
    93
    Par défaut
    Super ! Merci Snipah.

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

Discussions similaires

  1. Requete avec LEFT OUTER JOIN et COUNT
    Par ThitoO dans le forum Requêtes
    Réponses: 3
    Dernier message: 30/07/2009, 23h18
  2. [Optimisation] Requete trop lourde avec Left outer join...
    Par batosai dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/05/2006, 13h40
  3. Probleme de NULL avec LEFT OUTER JOIN
    Par jiluc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/01/2006, 14h42
  4. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07
  5. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17

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