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 :

requete retourne null si une des tables est vide


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Par défaut requete retourne null si une des tables est vide
    Bonjour,

    on me demande de faire une petite requete,
    Le principe récuperer les articles dont le AS_STATUT_DIV correspond à un code rupture et qui soit ne sont pas ou pas en cours dans la table de commentaire de rupture, soit que le code de rupture de la table commentaire ne soit pas le même que l'actuel.

    J'obtiens cette requête :
    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
     
     SELECT Tab1.AP_CODE, AS_LIB_40, Tab1.AS_STATUT_DIV 
        FROM  (
                SELECT ARTICLE_P.AP_CODE, AS_LIB_40, AS_STATUT_DIV FROM ARTICLE_S, ARTICLE_P
                WHERE ARTICLE_S.AS_NUMERO = ARTICLE_P.AS_NUMERO 
                AND ( 
                 ARTICLE_S.AS_STATUT_DIV = 'ZC'
                 OR ARTICLE_S.AS_STATUT_DIV = 'ZM'
                 OR ARTICLE_S.AS_STATUT_DIV = 'ZK'
                 OR ARTICLE_S.AS_STATUT_DIV = 'ZR'
                )
            ) Tab1,ARTICLE_COMMENT_RUPTURE
        WHERE
        (ARTICLE_COMMENT_RUPTURE.AP_CODE  =  Tab1.AP_CODE AND ARTICLE_COMMENT_RUPTURE.AS_STATUT_DIV <> Tab1.AS_STATUT_DIV  AND ACR_DATE_FIN IS NULL)
        OR
        (
          ( tab1.AP_CODE NOT IN (SELECT AP_CODE FROM ARTICLE_COMMENT_RUPTURE WHERE ACR_DATE_FIN IS NULL))
        );
    Mais pour une raison que j'ignore si la table ARTICLE_COMMENT_RUPTURE est vide ma requête ne me retourne rien et dès qu'il y a une ilgne elle marche normalement.

    une forme qui marche mais que je trouve moins sympa passe par l'union :
    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
    26
    27
    28
     
     SELECT Tab1.AP_CODE, AS_LIB_40, Tab1.AS_STATUT_DIV 
        FROM  (
                SELECT ARTICLE_P.AP_CODE, AS_LIB_40, AS_STATUT_DIV FROM ARTICLE_S, ARTICLE_P
                WHERE ARTICLE_S.AS_NUMERO = ARTICLE_P.AS_NUMERO 
                AND ( 
                 ARTICLE_S.AS_STATUT_DIV = 'ZC'
                 OR ARTICLE_S.AS_STATUT_DIV = 'ZM'
                 OR ARTICLE_S.AS_STATUT_DIV = 'ZK'
                 OR ARTICLE_S.AS_STATUT_DIV = 'ZR'
                )
            ) Tab1,ARTICLE_COMMENT_RUPTURE
        WHERE
        (ARTICLE_COMMENT_RUPTURE.AP_CODE  =  Tab1.AP_CODE AND ARTICLE_COMMENT_RUPTURE.AS_STATUT_DIV <> Tab1.AS_STATUT_DIV  AND ACR_DATE_FIN IS NULL)
       UNION
    SELECT Tab1.AP_CODE, AS_LIB_40, Tab1.AS_STATUT_DIV 
        FROM  (
                SELECT ARTICLE_P.AP_CODE, AS_LIB_40, AS_STATUT_DIV FROM ARTICLE_S, ARTICLE_P
                WHERE ARTICLE_S.AS_NUMERO = ARTICLE_P.AS_NUMERO 
                AND ( 
                 ARTICLE_S.AS_STATUT_DIV = 'ZC'
                 OR ARTICLE_S.AS_STATUT_DIV = 'ZM'
                 OR ARTICLE_S.AS_STATUT_DIV = 'ZK'
                 OR ARTICLE_S.AS_STATUT_DIV = 'ZR'
                )
            ) Tab1
    WHERE
          ( tab1.AP_CODE NOT IN (SELECT AP_CODE FROM ARTICLE_COMMENT_RUPTURE WHERE ACR_DATE_FIN IS NULL))
    si quelqu'un pouvait me dire pourquoi ma première requête ne marche pas dans le cas de "ARTICLE_COMMENT_RUPTURE" à vide et si il y a moyen de corriger ca.

    Je vous remercie d'avance.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Condition 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     (    article_comment_rupture.ap_code = tab1.ap_code
            AND article_comment_rupture.as_statut_div <> tab1.as_statut_div
            AND acr_date_fin IS NULL
           )
    Si article_comment_rupture est vide, pas de jointure donc pas de données.

    Condition 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      OR ((tab1.ap_code NOT IN (SELECT ap_code
                                    FROM article_comment_rupture
                                   WHERE acr_date_fin IS NULL)));
    Si article_comment_rupture est vide, vous avez 'NOT IN (NULL)', ce qui ne renvoie rien.

    Je ne comprends pas comment votre seconde requête renvoie quelque chose dans ce même cas...

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Par défaut
    merci de vous interressez à mon cas,
    pour la première condition la pas de problème j'avais bien compris.
    dans le cas de la seconde condition, votre explication me semble logique,
    j'ai donc essayé en remplaçant mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NOT IN (SELECT ap_code
                                    FROM article_comment_rupture
                                   WHERE acr_date_fin IS NULL)));
    par

    la ça ne me retourne effectivement rien j'ai donc tester la requête du not in seule et elle me retourne bien rien et pourtant avec ca ma deuxième requête fonctionne. je suis donc perplexe
    il doit y avoir une différence en les deux qui m'échappe

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Si votre table est vide, la jointure suivante ne trouve jamais de correspondance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ARTICLE_COMMENT_RUPTURE.AP_CODE = Tab1.AP_CODE
    De plus votre jointure sur le même AP_CODE mais un AS_STATUT_DIV différent me paraît relativement étrange, ca doit vous générer des doublons.

    Vous pourriez passer par une jointure externe.

    Mais j'en profite pour réécrire votre requête de cette façon :
    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
    SELECT
        ARP.AP_CODE,
        ARS.AS_LIB_40,
        ARS.AS_STATUT_DIV
    FROM
        ARTICLE_S ARS
        INNER JOIN ARTICLE_P ARP
          ON ARP.AS_NUMERO = ARS.AS_NUMERO
    WHERE 
        ARS.AS_STATUT_DIV IN ('ZC', 'ZK', 'ZM', 'ZR')
    AND ( EXISTS (SELECT NULL
                    FROM ARTICLE_COMMENT_RUPTURE AC2
                   WHERE AC2.AP_CODE = ARP.AP_CODE
                     AND AC2.AS_STATUT_DIV <> ARP.AS_STATUT_DIV
                     AND AC2.ACR_DATE_FIN IS NULL)
      OR NOT EXISTS (SELECT NULL
                      FROM ARTICLE_COMMENT_RUPTURE AC1
                     WHERE AC1.AP_CODE = ARP.AP_CODE
                       AND AC1.ACR_DATE_FIN IS NULL) )
    A tester bien évidement.

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Par défaut
    alors merci de m'aider, pour le test sur le different je ne peux pas avoir plus d'une ligne en cours (sans date de fin) par article dans ma table article_comment_rupture ce qui fait que le test sur le numero d'article et la nullité (on dit comme ca ?) de la date empèche les doublons dans ce cas.

    sinon merci pour ta "mise en forme" de ma requête rien que le IN pour les codes ruptures je devrais y penser mais à chaque fois j'oublie.
    Pour les exists j'ai mis un peu de temps à comprendre mais effectivement c'est plus propre vu qu'au final je ne fais appel à la table que pour tester la présence.

    testé avec et sans donné elle fonctionne parfaitement merci de votre aide je vais travailler à mieux penser mes requêtes, un jour ou l'autre ca va rentré.

    merci encore

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

Discussions similaires

  1. [XL-2007] Ne pas effectuer une conversion lorsque l'une des données est nulle.
    Par Tomz57 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 21/04/2015, 09h35
  2. [MySQL] ajouter une ligne si une des colonnes est vide
    Par JibsouX dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/08/2013, 18h45
  3. Jointure sur 2 tables dont l'une des 2 est vide
    Par renaud26 dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/10/2008, 20h17
  4. Ajout de deux colonnes lorsqu'une des deux est à null
    Par KibitO dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/09/2006, 14h07
  5. Réponses: 11
    Dernier message: 12/05/2006, 17h18

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