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

PL/SQL Oracle Discussion :

Table dérivée ..?


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut Table dérivée ..?
    Bonjour à tous,

    J'ai un fonctionnement d'oracle que je ne comprend pas avec les tables dérivées.

    Le but est de sortir la date "date_livr" pour 20160334a = "22/01/16" car on veut la date initiale (Qui correspond à celle du 20160334) et pas celle de la mise à jour pour simplifier.

    Jeu de données :
    20160334a 19/04/16
    20160334 22/01/16

    J'aurai fais naturellement le SELECT ci-dessous


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT a.*,
    CASE WHEN IS_TEXT_DSI(A.NUMERODEVISSELL) = 'Y'  THEN   (SELECT A.date_livr FROM TEST_Renouv B
                                                            WHERE TO_CHAR(A.NUMERODEVISSELL) = TO_CHAR(SUBSTR(B.NUMERODEVISSELL,1,LENGTH(B.NUMERODEVISSELL)-1))
                                                            )
                                                    ELSE A.DATe_livr 
    END DATE_T
    FROM  TEST_Renouv A
    Sauf qu'il me sort un Null ??
    SUBSTR(B.NUMERODEVISSELL,1,LENGTH(B.NUMERODEVISSELL)-1) = "20160334", donc je ne comprend pas.


    Note : IS_TEXT_DSI renvoit Y ou N si c'est du texte ou non.


    Merci d'avance pour vos explications!

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Ce ne serait pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CASE WHEN IS_TEXT_DSI(A.NUMERODEVISSELL) = 'Y'  THEN   (SELECT B.date_livr FROM TEST_Renouv B
                                                            WHERE TO_CHAR(A.NUMERODEVISSELL) = TO_CHAR(SUBSTR(B.NUMERODEVISSELL,1,LENGTH(B.NUMERODEVISSELL)-1))
                                                            )
                                                    ELSE A.DATe_livr

  3. #3
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    ça ne change rien, mais c'est normal puisque A = B,
    C'est censé me sortir le 22/01/16 dans les 2 cas.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Le substr est placé à l'envers, et c'est bien B.date_livr, puisque vous exécuter la requête dans le cas où A.NUMERODEVISSELL=20160334a, donc avec A.date_livr au 19/04 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CASE WHEN IS_TEXT_DSI(A.NUMERODEVISSELL) = 'Y'  
         THEN (SELECT B.date_livr 
                 FROM TEST_Renouv B
                WHERE B.NUMERODEVISSELL = SUBSTR(A.NUMERODEVISSELL,1,LENGTH(A.NUMERODEVISSELL)-1)
               )
         ELSE A.DATe_livr
     end
    J'ai viré les to_char inutile puisque la colonne NUMERODEVISSELL peut contenir 20160334a donc elle est en varchar2.

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    ah oui effectivement ça marche!
    Merci!!


    Par contre je ne comprend pas pourquoi ça marche dans un sens et pas dans l'autre?

    Car dire (de façon simplifiée) :
    WHERE A.ID = B.ID
    Ou
    WHERE B.ID = A.ID


    C'est pareil ? Enfin du coup, non. Mais plutôt pourquoi "non" dans une table dérivée?

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Mais qu'est-ce que tu entends par "table dérivée"? C'est un terme que je ne connais pas.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    A est la requête principale.
    À la sélection des lignes de A, on vérifie si A.NUMERODEVISSELL est numérique ou text (WHEN IS_TEXT_DSI(A.NUMERODEVISSELL) = 'Y')
    Si c'est du texte (A.NUMERODEVISSELL='20160334a') alors on part chercher la valeur de date_livr pour une autre version de ligne de la table TEST_Renouv B.

    Pour trouver la version de date_livr corrspondant au code numérique 20160334, il faut tronquer le code '20160334a' courrant de la table principale A du dernier caractère (SUBSTR(A.NUMERODEVISSELL,1,LENGTH(A.NUMERODEVISSELL)-1))

    On a donc bien la requête corrélée suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT B.date_livr 
      FROM TEST_Renouv B
     WHERE B.NUMERODEVISSELL = SUBSTR(A.NUMERODEVISSELL,1,LENGTH(A.NUMERODEVISSELL)-1)
    Si on fait le test suivant on aura en reprenant les 2 valeurs exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE TO_CHAR(A.NUMERODEVISSELL) = TO_CHAR(SUBSTR(B.NUMERODEVISSELL,1,LENGTH(B.NUMERODEVISSELL)-1))
    WHERE '20160334a' = '20160334' --pour la ligne ou B.NUMERODEVISSELL = '20160334a'
    WHERE '20160334a' = '2016033' --pour la ligne ou B.NUMERODEVISSELL = '20160334'
    Donc pas de correspondance et un résultat NULL.

    Dernier point, B doit renvoyer au plus une ligne sinon il y aura un message d'erreur.

    Je ne sais pas si c'est vraiment plus clair.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par BIOoOAG Voir le message
    ah oui effectivement ça marche!
    Merci!!


    Par contre je ne comprend pas pourquoi ça marche dans un sens et pas dans l'autre?

    Car dire (de façon simplifiée) :
    WHERE A.ID = B.ID
    Ou
    WHERE B.ID = A.ID


    C'est pareil ? Enfin du coup, non. Mais plutôt pourquoi "non" dans une table dérivée?
    Non car vous n'êtes pas dans un cas d'équi-jointure sur un identifiant unique, mais de subselect avec recherche sur une valeur partielle d'une colonne :
    WHERE B.NUMERODEVISSELL = SUBSTR(A.NUMERODEVISSELL....C'est d'ailleurs risqué car rien ne garantit que votre sub-select renvoie bien une ligne unique, et si ce n'est pas le cas votre requete plantera

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par Ikebukuro Voir le message
    Mais qu'est-ce que tu entends par "table dérivée"? C'est un terme que je ne connais pas.
    Dans ce cas ce n'est pas vraiment une table dérivée mais plutôt une sous-requête corrélée.

    Une table dérivée, c'est plutôt lorsqu'on utilise les sous-requête dans le FROM

  10. #10
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Merci pour vos réponses! J'ai appris plein de truc, dont des précisions sur le vocabulaire SQL!!

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

Discussions similaires

  1. BO5 table dérivée
    Par n.roussaly dans le forum Designer
    Réponses: 9
    Dernier message: 28/01/2009, 16h02
  2. Réponses: 6
    Dernier message: 09/11/2007, 19h33
  3. Ajout un ID dans une Table dérivée
    Par ecayuno dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/12/2006, 13h09
  4. Réponses: 6
    Dernier message: 04/07/2006, 11h56
  5. Procédure pour remplir table et sa table dérivée
    Par C_C dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/12/2005, 20h41

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