• # Jointure externe

    Posté par . En réponse au message Traduction de requêtes Oracle vers PostgreSQL. É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).