Bonjour, je suis en train de migrer une applications utilisant une base de donnée Oracle vers PostgreSQL.
La plupart des requêtes passent bien malgré les disparités.
Je tombe néanmoins sur un problème épineux et fréquent : le symbole (+)
En effet, je me trouve en face de requêtes du style :
select (...)
from (...)
Where
COLLABORATEURS.SER_ID=SERVICE.SER_ID(+)
ou
select (...)
from (...)
Where
(+)COLLABORATEURS.SER_ID=SERVICE.SER_ID
Pour le premier pas, d'après ce que j'ai compris (d'après quelques docs), il est équivalent de faire une jointure gauche :
select (...)
from (...)
Where
COLLABORATEURS.SER_ID=SERVICE.SER_ID(+)
deviendrai
select (...)
from (...)
Where
SERVICE.SER_ID left join COLLABORATEURS.SER_ID
Mais je n'en suis pas sûr
Autre subtilité, le placement à gauche ou à droite du symbole change pas mal de chose.
A part ça http://techdocs.postgresql.org/techdocs/oracle-to-pg-porting(...)
J'ai pas grand chose à manger et l'explication est pour le moins succinte.
Auriez vous d'autres infos ?
Merci !
# Jointure externe
Posté par alf . Évalué à 1.
Exactement.
En citant le lien que tu donnes toi-même:
En français, il s'agit d'une jointure externe. Ce qui signifie que si tu as, dans ta table A:
item_id | field1
------------------
1 | 'aze'
2 | 'rty'
et dans la table B
item_id | field2
------------------
1 | 13
La requête renverra
field1 | field2
-----------------
'aze' | 13
'rty' | NULL
I.e. la requête prend toutes les lignes de la table dont le champ ne porte pas le (+) dans la requête et, pour chacune:
- si aucune ligne dans l'autre table ne correspond (aucune ligne de B n'a d'item_id égal à celui de la ligne de A concernée), alors on utilise une "ligne vide" pour B (toutes les colonnes de B seront à NULL);
- si au moins une ligne de B correspond, le résultat de la requête aura autant de lignes.
D'après cela, tu comprends pourquoi placer le (+) à gauche ou à droite de la condition de jointure change les résultats...
La syntaxe avec le (+) est une "extension" au SQL fournie par Oracle; l'équivalent en pur SQL normalisé est:
Voir http://sqlpro.developpez.com/cours/sqlaz/jointures/ pour plus d'information sur les jointures (paragraphe 2.3 pour les jointures externes). Plus généralement, le site de Sqlpro est ma référence pour tout ce qui est SQL portable (sinon, voir la doc de ton implémentation pour les spécificités).
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.