Forum Programmation.SQL Traduction de requêtes Oracle vers PostgreSQL

Posté par  (site web personnel) .
Étiquettes : aucune
0
25
avr.
2006
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  . Évalué à 1.

    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 :

    Exactement.

    En citant le lien que tu donnes toi-même:
    Outer Joins work as follows:

    select a.field1, b.field2
    from a, b
    where a.item_id = b.item_id(+)

    where the (+) indicates that, if there is no row in table b that matches the correct item_id, the match should still happen, with an empty row from table b. In this case, for example, for all rows in table a where there is no matching row in b, a row will still be returned where a.field1 is correct, but b.field2 is null.

    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:
    select a.field1, b.field2
    from a left outer joint b on a.item_id = b.item_id


    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.