Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > ETL > Sunopsis
Sunopsis Forum d'entraide Sunopsis
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/03/2011, 15h31   #1
Membre du Club
 
Inscription : juin 2005
Messages : 269
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 269
Points : 67
Points : 67
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 :
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 :
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.
tatayoyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 16h01   #2
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
oui tu peux le faire sans table temporaire.

tu as ta jointure
Citation:
tab1.cle_jointure=tab2.cle_jointure
et tu ajoute en filtre sur champs num :
Citation:
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
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 16h23   #3
Membre du Club
 
Inscription : juin 2005
Messages : 269
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 269
Points : 67
Points : 67
Ok, merci bcp pour la réponse.
Je vais essayer ça.
c'est pas mal quand même ODI...
tatayoyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 16h48   #4
Membre du Club
 
Inscription : juin 2005
Messages : 269
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 269
Points : 67
Points : 67
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.
tatayoyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 09h47   #5
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
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.
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 11h25   #6
Membre du Club
 
Inscription : juin 2005
Messages : 269
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 269
Points : 67
Points : 67
en fait, ODI rajoute deja lui meme le (+) dans la requete SQL.
Meme si je saisie ma condition comme cela

Code :
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 :
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
tatayoyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 12h22   #7
Modérateur
 
Avatar de doc malkovich
 
Homme
Consultant en Business Intelligence
Inscription : juillet 2008
Messages : 950
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 : 950
Points : 1 467
Points : 1 467
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.
__________________
Avez-vous 60 secondes pour répondre aux sondages sur BO ici et ?
doc malkovich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 13h03   #8
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
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 :
Citation:
tab1.cle_jointure(+)=tab2.cle_jointure
et une condition
Citation:
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)
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 16h25   #9
Membre du Club
 
Inscription : juin 2005
Messages : 269
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 269
Points : 67
Points : 67
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 :
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.
tatayoyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 17h42   #10
Modérateur
 
Avatar de doc malkovich
 
Homme
Consultant en Business Intelligence
Inscription : juillet 2008
Messages : 950
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 : 950
Points : 1 467
Points : 1 467
tu peux faire une vue, par exemple

Code :
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.
__________________
Avez-vous 60 secondes pour répondre aux sondages sur BO ici et ?
doc malkovich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 15h13   #11
Membre du Club
 
Inscription : juin 2005
Messages : 269
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 269
Points : 67
Points : 67
Ok. ca nécessite un étape intermédiaire avant l'interface donc.
tatayoyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 16h56   #12
Modérateur
 
Avatar de doc malkovich
 
Homme
Consultant en Business Intelligence
Inscription : juillet 2008
Messages : 950
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 : 950
Points : 1 467
Points : 1 467
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 ...
__________________
Avez-vous 60 secondes pour répondre aux sondages sur BO ici et ?
doc malkovich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h19   #13
Membre du Club
 
Inscription : juin 2005
Messages : 269
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 269
Points : 67
Points : 67
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.
tatayoyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h08.


 
 
 
 
Partenaires

Hébergement Web