Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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
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