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

Designer Discussion :

[BO 6.5] Jointure complexe et tables dérivées


Sujet :

Designer

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 32
    Points : 40
    Points
    40
    Par défaut [BO 6.5] Jointure complexe et tables dérivées
    Bonjour à tous,

    Je rencontre un problème dans BO 6.5 concernant une jointure complexe avec une table dérivée.

    J'ai une table dérivé CLASSENIV1 issu d'une table dans laquelle je filtre les enregistrements suivant la longueur d'un code (requête de génération SELECT CLASSE,LIBELLE FROM CLASSE WHERE LENGTH(CLASSE)=1)
    Cette table contient donc toutes les classes de niveau 1

    J'ai une table PRODUIT qui contient le code complet de la classe (code de type A11B1C1) où le premier caractère correspond au 1er niveau (correspondance avec mes classes de niveau 1)

    Je fais donc une jointure entre ma table dérivée et cette table PRODUIT. La jointure est complexe (WHERE LPAD(PRODUIT.CLASSE,1)=CLASSENIV1.CLASSENIV1 )

    Lorsque je crée un rapport, la jointure n'est jamais utilisé , BO me fait 2 select sur chacune des tables.

    Pour essayer de résoudre le problème, j'ai essayé la même jointure sur la table CLASSE initiale et là ca marche ???

    Quelqu'un a t'il une idée ?

    Merci d'avance pour votre aide

  2. #2
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Bonjour,

    C'est pas très clair come explication ...
    Si tu avais montré le sql de ta table dérivée + 1 ligne de données
    on aurait pu se faire une idée de la jointure ...

    Si on essaie de comprendre ...
    table dérivée CLASSENIV1 :
    CLASSE 1 caractère mais on ne sait pas si c'est 'A' ou '1'
    LIBELLE classique
    table PRODUIT :
    CLASSE code complet de la classe (code de type A11B1C1)
    Où 1er caractère correspond au 1er niveau (A ?)

    De sorte que je ne comprends pas ce que LPAD vient faire ici ...?

    c'est pas plutôt une jointure du premier caractère de PRODUIT.CLASSE avec CLASSENIV1.CLASSENIV1 que tu veux faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    substr(PRODUIT.CLASSE,1)=CLASSENIV1.CLASSENIV1
    qu'en penses tu ?
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 32
    Points : 40
    Points
    40
    Par défaut
    Excusez moi si je n'ai pas été trés clair, un exemple :

    Dans ma table produit, champ classe :
    A11B1C1
    B12C3C4
    Toujours structuré de la même manière (le 1er caractére correspond au niveau 1, les deux seconds au niveau 2 etc...)

    Dans ma table CLASSE :
    A
    A11
    A12
    A11B
    A12B
    etc...
    B
    B11
    B12
    etc...

    Dans ma table dérivée, je n'ai donc que :
    A
    B

    Pour le LPAD je ne sais pas où j'avais la tête mais c'est bien substr qu'il faut lire (extraction du premier caractère de la classe dans la table produit)

    Excusez encore pour l'imprécision de ma question.

  4. #4
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Bon ! Je me disais aussi ...
    Donc cette jointure complexe c'est quoi au juste ?
    celle que j'ai devinée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    substr(PRODUIT.CLASSE,1)=CLASSENIV1.CLASSENIV1
    et elle ne marche pas ?
    compte le nb de caractères des deux colonnes jointes tu as peut être des espaces

    Tu dis que la jointure n'est pas utilisée
    Colle nous le sql utilisé entre balises code
    qu'on puisse voir de quoi tu parles
    Merci
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 32
    Points : 40
    Points
    40
    Par défaut
    Tout juste la jointure est celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CLASSENIV1.CLASSENIV1=substr(PRODUIT.CLASSE,1)
    Lorsque je crée un rapport en sélectionnant l'objet libellé de la classe (CLASSENIV1.LIBELLE) et la référence du produit (PRODUIT.REFERENCE), il me génére 2 sql san jointure

    SQL 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT   
      PRODUIT.REFERENCE
    FROM
      PRODUIT
    SQL 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT   
      CLASSENIV1.LIBELLE
    FROM
      ( SELECT CLASSE.CLASSE AS CLASSENIV1,CLASSE.LIBELLE 
    FROM CLASSE WHERE LENGTH(CLASSE.CLASSE)=1) CLASSENIV1
    Pour info comme je le disais dans mon premier message si je fais la même jointure sur la table initiale j'ai bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT   
      CLASSE.LIBELLE,
      PRODUIT.REFERENCE
    FROM
      CLASSE,
      PRODUIT
    WHERE
      ( SUBSTR(PRODUIT.CLASSE,1)=CLASSE.CLASSE  )

  6. #6
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    J'ai peut être une idée ...
    Dis moi dans les propositions suivantes celles qui sont vraies :
    • tu es en Oracle10
    • PRODUIT.CLASSE VARCHAR2(7) au moins
    • CLASSENIV1.CLASSENIV1 VARCHAR2(1)
    tu devrais essayer de remplacer le sql de ta table dérivée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CLASSE.CLASSE AS CLASSENIV1,CLASSE.LIBELLE 
    FROM CLASSE WHERE LENGTH(CLASSE.CLASSE)=1) CLASSENIV1
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT cast(CLASSE.CLASSE as varchar2(7)) AS CLASSENIV1,CLASSE.LIBELLE 
    FROM CLASSE WHERE LENGTH(CLASSE.CLASSE)=1) CLASSENIV1
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 32
    Points : 40
    Points
    40
    Par défaut
    * tu es en Oracle10
    NON oracle 8
    * PRODUIT.CLASSE VARCHAR2(7) au moins
    NON dans la table cela peut être variable ie produit rattaché à une classe de niveau 2 on a que 3 caractères
    * CLASSENIV1.CLASSENIV1 VARCHAR2(1)
    OUI

    J'ai testé la création de la table dérivé mais même problème

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 32
    Points : 40
    Points
    40
    Par défaut
    Petite précision supplémentaire.

    Ce n'est pas un problème de données car pour tester j'ai créé la table en dur dans un schéma

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TABLE CLASSENIV1 AS SELECT CLASSE AS CLASSENIV1,LIBELLE 
    FROM CLASSE WHERE LENGTH(CLASSE)=1
    et je peux faire ma jointure sans problème via une requête SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT LIBELLE,REFERENCE FROM 
    PRODUIT,CLASSENIV1 WHERE CLASSENIV1.CLASSENIV1=SUBSTR(PRODUIT,CLASSETH,1,1)

  9. #9
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Pour essayer le sql avec cast as tu pris la peine de regarder la taille des champs CLASSENIV1 et CLASSE

    dans mon exemple j'ai mis 7 mais il faut que ce soit la taille de la colonne CLASSE


    AUTRES PISTES DE RECHERCHE
    Est ce que tu as des contextes dans ton univers ?
    Si oui la table dérivée et la table PRODUIT sont elles dans le même contexte ?

    As tu des tables agrégées ?
    As tu créé des incompatibilités Table Objets ?
    Un objet de l'une incompatible avec l'autre suffirait pour créer ce problàme
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 32
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Grâce à vos indications j'ai résolu le problème c'était un problème de contexte entre les deux tables

    Merci beaucoup pour vos précieuses indications

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

Discussions similaires

  1. [MySQL-5.1] Jointure complexe à trois tables
    Par esa dans le forum Requêtes
    Réponses: 1
    Dernier message: 19/05/2013, 15h25
  2. [AC-2003] Jointure complexes - 5 tables
    Par DonKnacki dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/05/2011, 12h23
  3. Réponses: 0
    Dernier message: 29/08/2008, 23h47
  4. Réponses: 5
    Dernier message: 27/01/2008, 21h15
  5. Réponses: 6
    Dernier message: 04/07/2006, 11h56

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