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 29/06/2009 14:44:54

Galomu
Membre

FULL JOIN is only supported with merge-joinable join conditions

Bonjour,

Je suis en train de migrer une application BI d'Oracle vers PostgreSQL 8.3.
Je dois donc modifier chacune des requêtes SQL de façon à les adapter à Postgres. Il n'y pas de problème pour la majorité d'entre elles, mais certaines soulèvent une erreur : "FULL JOIN is only supported with merge-joinable join conditions"

J'ai beau chercher et essayer plusieurs choses, je ne trouve pas la solution.
Voici un exemple de requête posant problème :

------

select  sum(CA), sum(Marge), Annee,sum(CA2), sum(MArge2),Annee2, CLI_NOMCLIENT from
          (select sum(BUD_CARVALEUR) as CA ,sum(BUD_MAVALEUR) as Marge ,PER_NUMANNEE as Annee,CLI_IDCLIENT as Cli, AGE_LIBAGENCE as agence
        from sad.CLIENT left outer join sad.IND_BUDGET on CLI_IDCLIENT=BUD_IDCLIENT
          inner join sad.PERIODE on BUD_IDPERIODE=PER_IDPERIODE
          inner join sad.SITE on BUD_IDSITE=SIT_IDSITE 
          inner join sad.AGENCE on SIT_IDAGE=AGE_IDAGE
        where  PER_IDPERIODE between 1 and 6
          and AGE_NUMAGENCE like '44'
        group by PER_NUMANNEE,CLI_IDCLIENT,AGE_LIBAGENCE) r1

 full outer join

        (select sum(BUD_CARVALEUR) as CA2 ,sum(BUD_MAVALEUR) as Marge2 ,PER_NUMANNEE as Annee2 ,CLI_IDCLIENT as Cli2
        from sad.CLIENT left outer join sad.IND_BUDGET on CLI_IDCLIENT=BUD_IDCLIENT
          inner join sad.PERIODE on BUD_IDPERIODE=PER_IDPERIODE
          inner join sad.SITE on BUD_IDSITE=SIT_IDSITE 
          inner join sad.AGENCE on SIT_IDAGE=AGE_IDAGE
        where  PER_IDPERIODE between 7 and 13
          and AGE_NUMAGENCE like '44'
        group by PER_NUMANNEE,CLI_IDCLIENT) r2

on r1.CLI=r2.CLI2 
full outer join sad.CLIENT on (r2.CLI2=CLI_IDCLIENT  or r1.CLI=CLI_IDCLIENT )
where CA is not null or CA2 is not null
group by (CLI_NOMCLIENT)
order by CLI_NOMCLIENT

------

L'erreur disparait si j'enlève dans le dernier "full outer join" 'r2.CLI2=CLI_IDCLIENT' ou 'r1.CLI=CLI_IDCLIENT'

Pouvez vous me dire ce que signifie cette erreur, et comment y remédier ?

Merci d'avance.

Dernière modification par Galomu (29/06/2009 14:47:06)

Hors ligne

#2 29/06/2009 14:52:24

Marc Cousin
Membre

Re : FULL JOIN is only supported with merge-joinable join conditions

de quels types sont CLI_IDCLIENT, CLI et CLI2 ?
Le problème évoqué, c'est que pour faire un full outer join, postgresql a besoin de savoir trier le type de données utilisé dans la jointure (et qu'il ne sait pas trier ces 2 colonnes, probablement seulement tester l'égalité)

Dernière modification par Marc Cousin (29/06/2009 14:53:35)


Marc.

Hors ligne

#3 29/06/2009 14:57:26

Galomu
Membre

Re : FULL JOIN is only supported with merge-joinable join conditions

Merci pour votre réponse rapide.

CLI_IDCLIENT est de format Numeric, et CLI ET CLI2 également vu que ce sont des alias de CLI_IDCLIENT.
J'avoue ne pas comprendre le problème, pourquoi PostgreSQL ne saurait il pas trier les colonnes ?

Hors ligne

#4 29/06/2009 15:48:00

Marc Cousin
Membre

Re : FULL JOIN is only supported with merge-joinable join conditions

Parce que dans postgresql on peut créer de nombreux types. Et certains types n'ont pas d'opérateur de tri.

Je n'arrive pas a reproduire le problème avec du numeric 10,0.
Quelle définition exactement de numeric (précision) avez vous ?


Marc.

Hors ligne

#5 29/06/2009 15:51:12

Marc Cousin
Membre

Re : FULL JOIN is only supported with merge-joinable join conditions

On arrête tout, je me suis trompé. Le problème vient de :
r2.CLI2=CLI_IDCLIENT  or r1.CLI=CLI_IDCLIENT

Ce n'est pas un critère de jointure, puisqu'on ne lie pas une colonne d'une table à une autre. Il ne peut donc pas faire de merge join donc pas de full outer join.


Marc.

Hors ligne

#6 29/06/2009 16:18:06

Galomu
Membre

Re : FULL JOIN is only supported with merge-joinable join conditions

D'accord, je vois le problème, c'est plutôt logique finalement, je me demande pourquoi Oracle accepte ça ...
Me voilà bien avancé, je vais donc devoir modifier la forme de la requête ...
Pensez vous qu'un FULL OUTER JOIN supplémentaire me permettrait d'arriver à un résultat similaire à celui souhaité au départ ?

Quelque chose du genre :

(...)
full outer join sad.CLIENT as "tab_cli1" on (r2.CLI2=tab_cli1.CLI_IDCLIENT)
full outer join sad.CLIENT as "tab_cli2" on (r2.CLI=tab_cli2.CLI_IDCLIENT)
(...)

Hors ligne

#7 29/06/2009 18:28:10

Marc Cousin
Membre

Re : FULL JOIN is only supported with merge-joinable join conditions

probablement, mais je ne sais pas exactement ce que vous souhaitez smile


Marc.

Hors ligne

#8 30/06/2009 09:36:23

Galomu
Membre

Re : FULL JOIN is only supported with merge-joinable join conditions

Je suis arrivé à faire ce que je voulais en enchaînant deux full join, comme je le pensais.
Encore merci pour votre aide.

Hors ligne

Pied de page des forums