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

ODI (ex-Sunopsis) Discussion :

"Sous select" d'une table dans une interface


Sujet :

ODI (ex-Sunopsis)

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut "Sous select" d'une table dans une interface
    Bonjour,

    Si je voulais faire une interface qui joint deux tables, mais dont on ne prends que certains enregistrements de la deuxième table. En fait, on ne ferait pas la jointure directement sur la deuxieme table, mais sur un "sous select" de cette deuxieme table. Si cette interface se traduisait en SQL, on obtiendrait quelquechose de ce genre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT tab1.*
    FROM tab1, tab2
    WHERE tab1.cle_jointure=tab2.cle_jointure
    and tab2.champ_num = (select max(tab2bis.champ_num) from tab2 tab2bis where tab2bis.cle_jointure = tab1.cle_jointure )
    Suis je obligé de créer d'abord dans une interface indépendante une table temporaire comportant le max de champ_num pour chaque cle_jointure de ma table tab2 ? C'est à dire en SQL une interface qui ferait cette commande SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select max(champ_num),tab2.cle_jointure from tab2 group by tab2bis.cle_jointure
    Et ensuite de faire la jointure avec tab1 et la table temporaire obtenu dans la première interface.


    Ou puis je faire tout dans une seule interface, sans table temporaire (c'est ce que je souhaiterais pouvoir faire).
    J'espère avoir clairement expliqué mon problème, sinon demandez moi des précisions.
    Merci.

  2. #2
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    oui tu peux le faire sans table temporaire.

    tu as ta jointure
    tab1.cle_jointure=tab2.cle_jointure
    et tu ajoute en filtre sur champs num :
    tab2.champ_num = (SELECT max(tab2bis.champ_num) FROM tab2 tab2bis WHERE tab2bis.cle_jointure = tab1.cle_jointure )
    Dans les filtres et dans le mapping ODI tu peux utiliser tout ce qui peut être utilisé en SQL .

    J’espère avoir été assez clair
    Pour rendre la sous requête dynamique (qui puisse gérer les différent context)
    tu peut utiliser la fonction getSchemaName
    plus d'info dessus ici :
    http://gerardnico.com/doc/odi/webhel...chemaname.html

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut
    Ok, merci bcp pour la réponse.
    Je vais essayer ça.
    c'est pas mal quand même ODI...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut
    J'ai quand même un problème, c'est que je veux faire une jointure externe entre tab1 et tab2.
    Et j'obtiens une erreur SQL parceque Oracle ne peux pas faire de jointure externe sur un sous select.

  5. #5
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    Je n'en suis pas sur à 100% mais je pense que si tu veux avoir une jointure externe il faut le faire en 2 temps

    Mais il y a peut être une autre solution , celle de gérer toi même la jointure externe en mettant un (+) du coté de la table ou tu veux inclure toutes les lignes. Je n'ai pas tester cet solution.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut
    en fait, ODI rajoute deja lui meme le (+) dans la requete SQL.
    Meme si je saisie ma condition comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tab2.champ_num = (SELECT max(tab2bis.champ_num) FROM tab2 tab2bis WHERE tab2bis.cle_jointure = tab1.cle_jointure )
    j'obtiens finalement un SQL généré par ODI comme ceci dans le cas ou j'ai ouvert la jointure dans ODI :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab2.champ_num (+) = (SELECT max(tab2bis.champ_num) FROM tab2 tab2bis WHERE tab2bis.cle_jointure = tab1.cle_jointure (+) )
    Si je mets un (+) à la main dans ma condition, j'obtiens des (+)(+) à certains endroits dans le SQL résultant.
    Dans tous les cas, j'ai l'erreur SQL suivante :

    une colonne ne peut pas être jointe extérieurement à une sous-interrogation

  7. #7
    Expert confirmé
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Points : 4 285
    Points
    4 285
    Billets dans le blog
    1
    Par défaut
    Tu peux pas déclarer dans ODI la jointure en stricte et rajouter les (+) à la main ?
    Sinon tu peux aussi passer par une vue.

    Dans ODI 11g les interfaces temporaires sont directement utilisées pour faire du sous-select, on n'est plus obligé de passer par une table temporaire.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  8. #8
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    come l'a dis doc tu met la jointure en strict et les (+) tu les met à la main
    mais pas dans la condition !!!

    ca te donne une jonture ouverte :
    tab1.cle_jointure(+)=tab2.cle_jointure
    et une condition
    tab2.champ_num = (SELECT max(tab2bis.champ_num) FROM tab2 tab2bis WHERE tab2bis.cle_jointure = tab2.cle_jointure )
    (j'ai bien mis tab2 et non tab1 dans la sous requete)

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut
    Ok, avec cette méthode la jointure sur les tables est ouverte. Mais sur oracle, si tu n'ouvres pas aussi au niveau de la condition, c'est comme si tu fermais la jointure.
    Tu es donc obligé d'ouvrir la jointure sur les tables comme tu as fait (sur les clefs de jointure). Et tu dois aussi ouvrir la jointure sur la condition, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tab2.champ_num (+) = (SELECT max(tab2bis.champ_num) FROM tab2 tab2bis WHERE tab2bis.cle_jointure = tab2.cle_jointure )
    Mais le problème est que oracle me balance l'erreur suivante :
    ORA-01799: une colonne ne peut pas être jointe extérieurement à une sous-interrogation


    Doc, tu parles de faire une vue, directement dans ODI ? ou de la faire préalablement dans Oracle ?

    Merci à tous les deux pour votre aide.

  10. #10
    Expert confirmé
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Points : 4 285
    Points
    4 285
    Billets dans le blog
    1
    Par défaut
    tu peux faire une vue, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    create view vtab2 as
    select cle_jointure, max(champ_num) champ_num
    from tab2
    group by cle_jointure
    Et l'utiliser dans odi en jointure externe.
    Mais tu perds le lien avec la table dans les métadonnées odi.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut
    Ok. ca nécessite un étape intermédiaire avant l'interface donc.

  12. #12
    Expert confirmé
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Points : 4 285
    Points
    4 285
    Billets dans le blog
    1
    Par défaut
    Yes
    Soit tu crées la vue à l'avance, soit tu as l'ame d'un bricoleur et tu crées un KIM qui te génère ta vue à la volée ...
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 103
    Points
    103
    Par défaut
    merci pour vos réponses.
    Je pense que c'est trop spécifique à cette interface pour mettre ca dans un KM qui ont une vocation plus généraliste de mon point de vue.

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  3. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  4. Réponses: 2
    Dernier message: 02/06/2006, 11h26
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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