PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 20/05/2009 12:05:09

djalouk
Membre

Migration Vues Oracle avec jointures externes.

Bonjour,

J'effectue une migration de Oracle 9.2 vers Postgre 8.3.
J'utilise le script perl Ora2Pg.

Il me génère le script suivant

CREATE VIEW "v_pe" ("entity_data_5", "entity_fnc_incde", "usr_fnc_principal", "usr_fnc_secondaire", "usr_go_principal", "usr_go_secondaire", "go_secondaire", "fnc_secondaire", "go_principal", "fnc_principal", "bo_usr_excde", "entity_incde", "entity_excde", "entity_dsc", "entity_type_incde", "entity_crt_incde", "entity_crt_dte", "entity_mdf_incde", "entity_mdf_dte", "entity_pub_incde", "entity_pub_dte", "entity_sec_lvl", "entity_status_incde", "entity_version", "entity_go_incde", "entity_root_incde", "entity_summary", "entity_data_1", "entity_data_2", "entity_data_3", "entity_data_4") AS (select t_fnc_principal.usr_incde as usr_fnc_principal,
           t_fnc_secondaire.usr_incde as usr_fnc_secondaire,
           t_go_principal.usr_incde as usr_go_principal,
           t_go_secondaire.usr_incde as usr_go_secondaire,
           t_go_secondaire.go_secondaire as go_secondaire,
           t_fnc_secondaire.fnc_secondaire, t_go_principal.go_principal,
           t_fnc_principal.fnc_principal,  t_bo_usr.usr_excde as bo_usr_excde, t_entity.*
      from (select entity_incde, entity_go_incde as go_principal, usr_incde
              from p_entity, a_bo_usr_go
             where entity_go_incde = go_incde) t_go_principal,
           (select entity_incde, entity_fnc_incde as fnc_principal, usr_incde
              from p_entity, p_bo_usr
             where entity_fnc_incde = usr_fnc_incde) t_fnc_principal,
           (select p.entity_incde, fnc_incde as fnc_secondaire, usr_incde
              from p_entity p, a_entity_fnc a, p_bo_usr
             where a.entity_incde = p.entity_incde
               and fnc_incde = usr_fnc_incde) t_fnc_secondaire,
           (select p.entity_incde, a.go_incde as go_secondaire, usr_incde
              from p_entity p, a_entity_go a, a_bo_usr_go abug
             where a.entity_incde = p.entity_incde
               and a.go_incde = abug.go_incde) t_go_secondaire,
           p_entity t_entity, p_bo_usr t_bo_usr
     where t_fnc_principal.entity_incde(+) = t_entity.entity_incde
       and t_go_principal.entity_incde(+) = t_entity.entity_incde
       and t_fnc_secondaire.entity_incde(+) = t_entity.entity_incde
       and t_go_secondaire.entity_incde(+) = t_entity.entity_incde
	   and t_bo_usr.usr_incde(+) = t_entity.entity_crt_incde);

Et bien évidemment lorsque je joue le script, Postgre n'aime pas les jointures externes avec (+)

Des idées ?

Dernière modification par djalouk (20/05/2009 12:05:36)

Hors ligne

#2 20/05/2009 13:28:36

daamien
damien clochard

Re : Migration Vues Oracle avec jointures externes.

Il faut utiliser la syntaxe LEFT OUTER JOIN

des exemples par ici : http://docs.postgresqlfr.org/current/tutorial-join.html

Concrètement tu remplaces les lignes du type :

    [...] WHERE t_fnc_principal.entity_incde(+) = t_entity.entity_incde [...]

par

 [...] FROM [...] t_fnc_principal LEFT OUTER JOIN t_entity on ( t_fnc_principal.entity_incde(+) = t_entity.entity_incde ) [...]

Hors ligne

#3 20/05/2009 14:39:55

djalouk
Membre

Re : Migration Vues Oracle avec jointures externes.

J'ai testé ta ligne, même erreur, en fait je pense qu'il n'aime pas les (+).

Dernière modification par djalouk (20/05/2009 14:40:06)

Hors ligne

#4 20/05/2009 15:13:40

gleu
Administrateur

Re : Migration Vues Oracle avec jointures externes.

Oui, il faut enlever le « (+) ».


Guillaume.

Hors ligne

#5 20/05/2009 15:31:12

djalouk
Membre

Re : Migration Vues Oracle avec jointures externes.

Voici la vue obtenue :

CREATE VIEW "v_pe" ("entity_data_5", "entity_fnc_incde", "usr_fnc_principal", "usr_fnc_secondaire", "usr_go_principal", "usr_go_secondaire", "go_secondaire", "fnc_secondaire", "go_principal", "fnc_principal", "bo_usr_excde", "entity_incde", "entity_excde", "entity_dsc", "entity_type_incde", "entity_crt_incde", "entity_crt_dte", "entity_mdf_incde", "entity_mdf_dte", "entity_pub_incde", "entity_pub_dte", "entity_sec_lvl", "entity_status_incde", "entity_version", "entity_go_incde", "entity_root_incde", "entity_summary", "entity_data_1", "entity_data_2", "entity_data_3", "entity_data_4") AS (select t_fnc_principal.usr_incde as usr_fnc_principal,
           t_fnc_secondaire.usr_incde as usr_fnc_secondaire,
           t_go_principal.usr_incde as usr_go_principal,
           t_go_secondaire.usr_incde as usr_go_secondaire,
           t_go_secondaire.go_secondaire as go_secondaire,
           t_fnc_secondaire.fnc_secondaire, t_go_principal.go_principal,
           t_fnc_principal.fnc_principal,  t_bo_usr.usr_excde as bo_usr_excde, t_entity.*
      from (select entity_incde, entity_go_incde as go_principal, usr_incde
              from p_entity, a_bo_usr_go
             where entity_go_incde = go_incde) t_go_principal,
           (select entity_incde, entity_fnc_incde as fnc_principal, usr_incde
              from p_entity, p_bo_usr
             where entity_fnc_incde = usr_fnc_incde) t_fnc_principal,
           (select p.entity_incde, fnc_incde as fnc_secondaire, usr_incde
              from p_entity p, a_entity_fnc a, p_bo_usr
             where a.entity_incde = p.entity_incde
               and fnc_incde = usr_fnc_incde) t_fnc_secondaire,
           (select p.entity_incde, a.go_incde as go_secondaire, usr_incde
              from p_entity p, a_entity_go a, a_bo_usr_go abug
             where a.entity_incde = p.entity_incde
               and a.go_incde = abug.go_incde) t_go_secondaire,
           p_entity t_entity, p_bo_usr t_bo_usr,
	   t_fnc_principal LEFT OUTER JOIN t_entity on ( t_fnc_principal.entity_incde = t_entity.entity_incde ),
	   t_go_principal LEFT OUTER JOIN t_entity on ( t_go_principal.entity_incde = t_entity.entity_incde ),
	   t_fnc_secondaire LEFT OUTER JOIN t_entity on ( t_fnc_secondaire.entity_incde = t_entity.entity_incde ),
	   t_go_secondaire LEFT OUTER JOIN t_entity on ( t_go_secondaire.entity_incde = t_entity.entity_incde ),
	   t_bo_usr LEFT OUTER JOIN t_entity on ( t_bo_usr.usr_incde = t_entity.entity_crt_incde )
);

J'ai maintenant l'erreur suivante :
ERROR: relation "t_fnc_principal" does not exist
État SQL :42P01

Désolé, mais là, je suis dépassé.

Merci pour votre aide.

Hors ligne

#6 20/05/2009 15:55:02

gleu
Administrateur

Re : Migration Vues Oracle avec jointures externes.

t_fnc_principal, t_go_principal, t_fnc_secondaire, t_go_secondaire et t_bo_usr sont déjà déclarées au dessus. Ça devrait plutôt donner la requête suivante :

CREATE VIEW "v_pe" ("entity_data_5", "entity_fnc_incde", "usr_fnc_principal", "usr_fnc_secondaire", "usr_go_principal", "usr_go_secondaire", "go_secondaire", "fnc_secondaire", "go_principal", "fnc_principal", "bo_usr_excde", "entity_incde", "entity_excde", "entity_dsc", "entity_type_incde", "entity_crt_incde", "entity_crt_dte", "entity_mdf_incde", "entity_mdf_dte", "entity_pub_incde", "entity_pub_dte", "entity_sec_lvl", "entity_status_incde", "entity_version", "entity_go_incde", "entity_root_incde", "entity_summary", "entity_data_1", "entity_data_2", "entity_data_3", "entity_data_4") AS (select t_fnc_principal.usr_incde as usr_fnc_principal,
           t_fnc_secondaire.usr_incde as usr_fnc_secondaire,
           t_go_principal.usr_incde as usr_go_principal,
           t_go_secondaire.usr_incde as usr_go_secondaire,
           t_go_secondaire.go_secondaire as go_secondaire,
           t_fnc_secondaire.fnc_secondaire, t_go_principal.go_principal,
           t_fnc_principal.fnc_principal,  t_bo_usr.usr_excde as bo_usr_excde, t_entity.*
      from (select entity_incde, entity_go_incde as go_principal, usr_incde
              from p_entity, a_bo_usr_go
             where entity_go_incde = go_incde) t_go_principal
           LEFT OUTER JOIN t_entity on ( t_go_principal.entity_incde = t_entity.entity_incde ),
           (select entity_incde, entity_fnc_incde as fnc_principal, usr_incde
              from p_entity, p_bo_usr
             where entity_fnc_incde = usr_fnc_incde) t_fnc_principal
           LEFT OUTER JOIN t_entity on ( t_fnc_principal.entity_incde = t_entity.entity_incde ),
           (select p.entity_incde, fnc_incde as fnc_secondaire, usr_incde
              from p_entity p, a_entity_fnc a, p_bo_usr
             where a.entity_incde = p.entity_incde
               and fnc_incde = usr_fnc_incde) t_fnc_secondaire
           LEFT OUTER JOIN t_entity on ( t_fnc_secondaire.entity_incde = t_entity.entity_incde ),
           (select p.entity_incde, a.go_incde as go_secondaire, usr_incde
              from p_entity p, a_entity_go a, a_bo_usr_go abug
             where a.entity_incde = p.entity_incde
               and a.go_incde = abug.go_incde) t_go_secondaire
           LEFT OUTER JOIN t_entity on ( t_go_secondaire.entity_incde = t_entity.entity_incde ),
           p_entity t_entity, p_bo_usr t_bo_usr
           LEFT OUTER JOIN t_entity on ( t_bo_usr.usr_incde = t_entity.entity_crt_incde )
);

Pas sûr que ce soit exactement ça, la requête étant assez complexe.


Guillaume.

Hors ligne

#7 20/05/2009 17:11:20

flo
Membre

Re : Migration Vues Oracle avec jointures externes.

Il me semble qu'il y a une erreur dans le sens de la jointure :
le + sous Oracle donne le côté où il peut y avoir des NULL (ici c'est sur  t_fnc_principal pour la première jointure, ce qui veut dire qu'on doit prendre tous les éléments de t_entity)
Or le t_fnc_principal LEFT OUTER JOIN t_entity on signifie qu'on prend tous les éléments de t_fcn_principal.
(la difficulté avec la syntaxe en + c'est que selon les moteurs le + n'est pas toujours du même côté : c'est probablement de là que vient l'erreur)

http://www.orafaq.com/wiki/Outer_join


Ici t_entity est la table "centrale" (celle dont on prend toutes les lignes, qu'il y ait ou non correspondance) et on fait des jointures externes sur les autres (qui sont elles-mêmes des résultats de requêtes)

Si je ne fais pas d'erreur, le select devrait donner :

select t_fnc_principal.usr_incde as usr_fnc_principal,
           t_fnc_secondaire.usr_incde as usr_fnc_secondaire,
           t_go_principal.usr_incde as usr_go_principal,
           t_go_secondaire.usr_incde as usr_go_secondaire,
           t_go_secondaire.go_secondaire as go_secondaire,
           t_fnc_secondaire.fnc_secondaire, t_go_principal.go_principal,
           t_fnc_principal.fnc_principal,  t_bo_usr.usr_excde as bo_usr_excde, t_entity.*
      from 	p_entity t_entity
		LEFT OUTER JOIN 
		(
			select entity_incde, entity_go_incde as go_principal, usr_incde
              		from p_entity, a_bo_usr_go
             		where entity_go_incde = go_incde
		) t_go_principal
           	ON ( t_go_principal.entity_incde = t_entity.entity_incde )
		LEFT OUTER JOIN
           	(
			select entity_incde, entity_fnc_incde as fnc_principal, usr_incde
              		from p_entity, p_bo_usr
             		where entity_fnc_incde = usr_fnc_incde
		) t_fnc_principal
                ON ( t_fnc_principal.entity_incde = t_entity.entity_incde )
		LEFT OUTER JOIN
                (
			select p.entity_incde, fnc_incde as fnc_secondaire, usr_incde
              		from p_entity p, a_entity_fnc a, p_bo_usr
             		where a.entity_incde = p.entity_incde
               		and fnc_incde = usr_fnc_incde
		) t_fnc_secondaire
           	ON ( t_fnc_secondaire.entity_incde = t_entity.entity_incde )
		LEFT OUTER JOIN
           	(
			select p.entity_incde, a.go_incde as go_secondaire, usr_incde
              		from p_entity p, a_entity_go a, a_bo_usr_go abug
             		where a.entity_incde = p.entity_incde
               		and a.go_incde = abug.go_incde
		) t_go_secondaire
           	ON ( t_go_secondaire.entity_incde = t_entity.entity_incde )
		LEFT OUTER JOIN 
			p_bo_usr t_bo_usr
                ON ( t_bo_usr.usr_incde = t_entity.entity_crt_incde )

Hors ligne

#8 20/05/2009 18:08:52

djalouk
Membre

Re : Migration Vues Oracle avec jointures externes.

Comme je vous sens chauds, j'essaie également de transformer ce SELECT :

select
          t_fnc_principal.entity_incde as entity_incde,
          t_fnc_principal.entity_excde as entity_excde,
          t_fnc_principal.entity_dsc as entity_dsc,
          t_fnc_principal.entity_summary as entity_summary,
          t_fnc_principal.entity_data_5 as entity_data_5,
          t_fnc_principal.acro as  acro,
          t_fnc_principal.proj_prj_titre as proj_prj_titre, 
          t_fnc_principal.proj_obj_fin_porteur_projet as proj_obj_fin_projet,
          t_fnc_principal.proj_pos_exist_projet as proj_pos_exist_projet,
          t_fnc_principal.proj_methode_oeuvre as proj_methode_oeuvre,
          t_fnc_principal.proj_apport_result as proj_apport_result,
          t_fnc_principal.proj_mode_val as proj_mode_val,
          t_fnc_principal.proj_nom_syn as proj_nom_syn,
          t_fnc_principal.entity_data_4 as entity_data_4,
          t_fnc_principal.entity_type_incde as entity_type_incde,
          t_fnc_principal.entity_crt_dte as entity_crt_dte,
          t_fnc_principal.entity_sec_lvl as entity_sec_lvl,
          t_fnc_principal.entity_status_incde as entity_status_incde,
          t_fnc_principal.entity_version as entity_version,
          t_fnc_principal.entity_go_incde as entity_go_incde,
          t_go_secondaire.go_secondaire as go_secondaire,
          t_financeur.ref_dsc as ref_dsc
          from
                (select entity_incde, entity_excde, entity_dsc, entity_summary,
                    entity_data_5, 
                    pp.proj_prj_acro as acro, 
                    pp.proj_prj_titre as proj_prj_titre, 
                    pp.proj_obj_fin_porteur_projet ,
                    pp.proj_pos_exist_projet ,
                    pp.proj_methode_oeuvre ,
                    pp.proj_apport_result ,
                    pp.proj_mode_val ,
                    pp.proj_nom_syn ,
                    entity_data_4,
           	        entity_type_incde, entity_crt_dte, entity_sec_lvl,
                    entity_status_incde, entity_version, entity_go_incde
                from   p_entity pe, p_projet pp
                where  pe.entity_incde = pp.proj_incde) t_fnc_principal ,
                (select p.entity_incde, a.go_incde as go_secondaire
                from   p_entity p, a_entity_go a
                where  a.entity_incde = p.entity_incde) t_go_secondaire, p_entity t_entity, 
                (select  ref_incde, ref_dsc from a_bo_financement, r_financeur
                     where fin_finceur_incde(+) = ref_incde ) t_financeur
   
   
   
   where t_fnc_principal.entity_incde(+) = t_entity.entity_incde
   and   t_go_secondaire.entity_incde(+) = t_entity.entity_incde
   and   t_financeur.ref_incde (+)       = t_entity.entity_incde 
   and  t_entity.entity_status_incde!=12
   and  t_entity.entity_status_incde!=14
   and  t_entity.entity_status_incde!=13

Merci !

Hors ligne

#9 20/05/2009 18:42:03

Marc Cousin
Membre

Re : Migration Vues Oracle avec jointures externes.

Salut,

Il vaut mieux vous vous appropriiez la syntaxe, cela sera plus rapide  et plus profitable pour tout le monde je pense..
Pour résumer :
SELECT xxxxx
FROM a,b
WHERE a.champ_a=b.champ_b(+)

devient :
SELECT xxxx
FROM a LEFT JOIN b
ON (a.champ_a=b.champ_b)

Au passage, cette notation (normalisée dans SQL, édition 99 je crois) est celle qui est recommandée dans Oracle. Depuis la 9i de mémoire.


Marc.

Hors ligne

#10 22/05/2009 14:22:38

djalouk
Membre

Re : Migration Vues Oracle avec jointures externes.

Oui c'est mieux en effet wink

Pour info, cela fonctionne très bien, la syntaxe de flo est la bonne, la requête est d'ailleurs beaucoup plus rapide avec la syntaxe LEFT OUTER JOIN à la place de (+).

Merci à tous !

Hors ligne

#11 22/05/2009 15:38:49

Marc Cousin
Membre

Re : Migration Vues Oracle avec jointures externes.

Oui, c'est un détail amusant, l'histoire du LEFT OUTER JOIN plus rapide que la syntaxe + sous Oracle...

C'est censé être identique, d'après la doc, mais on est un certain nombre à avoir constaté que ce n'était pas toujours le cas smile


Marc.

Hors ligne

#12 01/06/2009 15:03:34

djalouk
Membre

Re : Migration Vues Oracle avec jointures externes.

Je reviens à la charge car j'ai un petit souci.

La transformation de cette requête (Oracle 9i) :

SELECT  AAP_INCDE, AAP_CLOS_MODE, AAP_CLOS_DTE,  AAP_CLOS_TIM, AAP_CTC_1, AAP_CTC_2,  AAP_CTC_3, AAP_CTC_4, AAP_CTC_5,
AAP_CTC_EMAIL_1, AAP_CTC_EMAIL_2, AAP_CTC_EMAIL_3,   AAP_CTC_EMAIL_4, AAP_CTC_EMAIL_5, AAP_SEND_1,
AAP_SEND_2, AAP_SEND_EMAIL_1, AAP_SEND_EMAIL_2,    AAP_SEND_ADRESS, p_entity.ENTITY_INCDE, ENTITY_EXCDE, ENTITY_DSC,
ENTITY_TYPE_INCDE, ENTITY_CRT_INCDE, ENTITY_CRT_DTE,   ENTITY_MDF_INCDE, ENTITY_MDF_DTE, ENTITY_PUB_INCDE,
ENTITY_PUB_DTE, ENTITY_SEC_LVL, ENTITY_STATUS_INCDE,    ENTITY_VERSION, ENTITY_GO_INCDE, ENTITY_ROOT_INCDE,
ENTITY_SUMMARY, ENTITY_DATA_1, ENTITY_DATA_2,    ENTITY_DATA_3, ENTITY_DATA_4, ENTITY_DATA_5,    ENTITY_FNC_INCDE
FROM p_entity, a_theme_go, p_aap, a_entity_go
where p_aap.aap_incde = p_entity.entity_incde 
and p_entity.entity_status_incde = CAST(3 as integer)
and	 p_entity.entity_incde = a_entity_go.ENTITY_INCDE(+)
and a_entity_go.GO_INCDE = a_theme_go.go_incde(+)
and a_theme_go.theme_incde  =  CAST(2 as integer)

en cette requête (syntaxe standard - destination PostgreSQL 8.3):

SELECT  AAP_INCDE, AAP_CLOS_MODE, AAP_CLOS_DTE,  AAP_CLOS_TIM, AAP_CTC_1, AAP_CTC_2,  AAP_CTC_3, AAP_CTC_4, AAP_CTC_5,
AAP_CTC_EMAIL_1, AAP_CTC_EMAIL_2, AAP_CTC_EMAIL_3,   AAP_CTC_EMAIL_4, AAP_CTC_EMAIL_5, AAP_SEND_1,
AAP_SEND_2, AAP_SEND_EMAIL_1, AAP_SEND_EMAIL_2,    AAP_SEND_ADRESS, p_entity.ENTITY_INCDE, ENTITY_EXCDE, ENTITY_DSC,
ENTITY_TYPE_INCDE, ENTITY_CRT_INCDE, ENTITY_CRT_DTE,   ENTITY_MDF_INCDE, ENTITY_MDF_DTE, ENTITY_PUB_INCDE,
ENTITY_PUB_DTE, ENTITY_SEC_LVL, ENTITY_STATUS_INCDE,    ENTITY_VERSION, ENTITY_GO_INCDE, ENTITY_ROOT_INCDE,
ENTITY_SUMMARY, ENTITY_DATA_1, ENTITY_DATA_2,    ENTITY_DATA_3, ENTITY_DATA_4, ENTITY_DATA_5,    ENTITY_FNC_INCDE
FROM p_aap,
p_entity left join a_entity_go on (p_entity.entity_incde = a_entity_go.ENTITY_INCDE),
a_entity_go left join a_theme_go  on (a_entity_go.GO_INCDE = a_theme_go.go_incde)
where p_aap.aap_incde = p_entity.entity_incde 
and p_entity.entity_status_incde = CAST(3 as integer)
and a_theme_go.theme_incde  =  CAST(2 as integer)

ne renvoit pas le même résultat (plein de lignes identiques dans la 2ème)

Je ne vois pas ou est mon erreur (surement une jointure mal faite puisque plein de doublons mais où...), si vous avez un tuyau, merci.

Hors ligne

#13 01/06/2009 15:54:53

flo
Membre

Re : Migration Vues Oracle avec jointures externes.

djalouk a écrit :
FROM 
    p_aap,
    p_entity left join a_entity_go on (p_entity.entity_incde = a_entity_go.ENTITY_INCDE),
    a_entity_go left join a_theme_go  on (a_entity_go.GO_INCDE = a_theme_go.go_incde)

Tu as mis 2 fois la table a_entity... En fait, si on met p_aap de côté pour l'instant, ce que tu demandes au moteur, c'est de calculer d'une part la jointure entre p_entity et a_entity :

    p_entity left join a_entity_go on (p_entity.entity_incde = a_entity_go.ENTITY_INCDE),

D'autre part la jointure entre a_entity et a_theme :

    a_entity_go left join a_theme_go  on (a_entity_go.GO_INCDE = a_theme_go.go_incde)

Et de faire le produit cartésien des 2... d'où les lignes en trop.

Il aurait fallu écrire comme ceci :


    p_entity left join a_entity_go on (p_entity.entity_incde = a_entity_go.ENTITY_INCDE) 
                left join a_theme_go  on (a_entity_go.GO_INCDE = a_theme_go.go_incde)

et attention, tu as laissé la jointure entre p_aap et p_entity dans la clause where (c'est pas très propre, il vaudrait mieux la mettre avec tout ça dans un inner join smile

Ca doit être donner quelque chose de ce genre, si je ne fais pas d'erreur :

FROM
    p_aap 
       INNER JOIN p_entity 
             ON (p_aap.aap_incde = p_entity.entity_incde) 
       LEFT OUTER JOIN a_entity_go 
             ON (p_entity.entity_incde = a_entity_go.ENTITY_INCDE)
       LEFT OUTER JOIN a_theme_go  
             ON (a_entity_go.GO_INCDE = a_theme_go.go_incde)

Hors ligne

#14 03/06/2009 15:33:53

djalouk
Membre

Re : Migration Vues Oracle avec jointures externes.

Vraiment merci Flo, tu m'as permis d'avancer et de convertir un certain nombres de requêtes, tout fonctionne bien, je coince cependant sur celle-ci et donc, je sollicite à nouveau votre aide (je n'ai pas encore tout saisi...mais j'ai bon espoir...)


J'ai ceci

SELECT p_entity.ENTITY_INCDE,ENTITY_DSC,RESULT_INCDE,ENTITY_GO_INCDE,DOC_AUTHOR,RESULT_REAL_DTE,RESULT_TYPE_INCDE,REF_EXCDE 
             FROM p_resultat,r_resultat_type rr, p_entity, r_go, a_entity_document aed, p_document doc
             WHERE p_entity.entity_incde = p_resultat.result_incde
             AND p_entity.entity_go_incde = r_go.go_incde
             AND p_entity.entity_status_incde = 4 
             AND p_entity.entity_sec_lvl = 0
             AND p_entity.entity_incde =  aed.ENTITY_INCDE(+)
             AND p_resultat.RESULT_TYPE_INCDE =  rr.REF_INCDE(+)
             AND aed.DOC_INCDE = doc.DOC_INCDE (+) 
             ORDER BY p_entity.ENTITY_INCDE DESC

et j'ai commencé à écrire ceci, il reste une jointure à faire mais je ne vois pas bien comment faire :

SELECT p_entity.ENTITY_INCDE,ENTITY_DSC,RESULT_INCDE,ENTITY_GO_INCDE,DOC_AUTHOR,RESULT_REAL_DTE,RESULT_TYPE_INCDE,REF_EXCDE 
             FROM r_go,
             p_entity INNER JOIN p_resultat LEFT OUTER JOIN r_resultat_type
             ON (p_resultat.RESULT_TYPE_INCDE =  r_resultat_type.REF_INCDE)
             ON (p_entity.entity_incde = p_resultat.result_incde),
             a_entity_document LEFT OUTER JOIN p_document ON (a_entity_document.DOC_INCDE = p_document.DOC_INCDE)
             
             WHERE p_entity.entity_go_incde = r_go.go_incde
             AND p_entity.entity_status_incde = 4 
             AND p_entity.entity_sec_lvl = 0
             and p_entity.entity_incde =  a_entity_document.ENTITY_INCDE(+)
             
			 ORDER BY p_entity.ENTITY_INCDE DESC

désolé et encore merci, je continue à investiguer...

Hors ligne

#15 03/06/2009 18:42:59

Marc Cousin
Membre

Re : Migration Vues Oracle avec jointures externes.

Je ne l'ai évidemment pas vérifié ...

SELECT p_entity.ENTITY_INCDE,ENTITY_DSC,RESULT_INCDE,ENTITY_GO_INCDE,DOC_AUTHOR,RESULT_REAL_DTE,RESULT_TYPE_INCDE,REF_EXCDE
             FROM p_resultat
             JOIN p_entity
                           ON (p_entity.entity_incde = p_resultat.result_incde)
             JOIN r_go
                           ON (p_entity.entity_go_incde = r_go.go_incde)
             LEFT JOIN r_resultat_type rr
                           ON (p_resultat.RESULT_TYPE_INCDE =  rr.REF_INCDE)
             LEFT JOIN  a_entity_document aed
                           ON (p_entity.entity_incde =  aed.ENTITY_INCDE)
             LEFT JOIN p_document doc
                           ON (aed.DOC_INCDE = doc.DOC_INCDE)
WHERE
             p_entity.entity_status_incde = 4
             AND p_entity.entity_sec_lvl = 0


             ORDER BY p_entity.ENTITY_INCDE DESC

Au passage, je me suis permis de mettre les LEFT JOIN à la fin. Je trouve cela plus lisible (on est comme ça sûr dès la première lecture de la requête que les JOIN ne dépendent pas du LEFT JOIN).

Dernière modification par Marc Cousin (03/06/2009 18:44:57)


Marc.

Hors ligne

#16 04/06/2009 14:45:06

djalouk
Membre

Re : Migration Vues Oracle avec jointures externes.

C'est bon, c'est bien ça.

Ce n'est pas encore tout à fait clair, mais c'est déjà mieux, à pratiquer encore.

Merci !

Hors ligne

Pied de page des forums