web-dev-qa-db-fra.com

Oracle: Que fait `(+)` dans une clause WHERE?

Trouvé ce qui suit dans une application basée sur Oracle que nous migrons (généralisé):

SELECT
    Table1.Category1,
    Table1.Category2,
    count(*) as Total,
    count(Tab2.Stat) AS Stat
FROM Table1, Table2
WHERE (Table1.PrimaryKey = Table2.ForeignKey(+))
GROUP BY Table1.Category1, Table1.Category2

Qu'est-ce que (+) faire dans une clause WHERE? Je ne l'ai jamais vu utilisé comme ça auparavant.

55
Jonathan Lonowski

Selon le côté du "=" le "(+) est activé, il désigne une jointure LEFT OUTER ou RIGHT OUTER (dans ce cas, il s'agit d'une jointure externe gauche). C'est l'ancienne syntaxe Oracle qui est parfois préférée par les personnes qui l'ont appris en premier, car ils aiment que cela rend leur code plus court.

Il est préférable de ne pas l'utiliser, par souci de lisibilité.

89
SquareCog

Comme d'autres l'ont dit, la syntaxe (+) Est une syntaxe propriétaire obsolète qu'Oracle a utilisée pendant des années pour obtenir les mêmes résultats qu'un OUTER JOIN. Je suppose qu'ils ont adopté leur syntaxe propriétaire avant que SQL-92 ne décide de la syntaxe standard.

La requête équivalente à celle que vous avez montrée, en utilisant la syntaxe SQL OUTER JOIN Standard (qui est désormais prise en charge par toutes les implémentations RDBMS principales) serait la suivante:

SELECT
    Table1.Category1,
    Table1.Category2,
    COUNT(*) AS Total,
    COUNT(Table2.Stat) AS Stat
FROM Table1
  LEFT OUTER JOIN Table2 ON (Table1.PrimaryKey = Table2.ForeignKey)
GROUP BY Table1.Category1, Table1.Category2;

Ce qui signifie:

  • Toutes les lignes de Table1 Sont incluses dans le résultat de la requête.
  • Là où il y a des lignes correspondantes dans Table2, Incluez ces lignes (en répétant le contenu de Table1 S'il y a plusieurs lignes correspondantes dans Table2).
  • Lorsqu'il n'y a pas de lignes correspondantes dans Table2, Utilisez NULL pour toutes les colonnes de Table2 Dans le résultat de la requête.
24
Bill Karwin

Il s'agit d'une notation de jointure externe gauche non ANSI. À partir d'Oracle9i, la syntaxe de jointure externe confuse utilisant la notation ‘(+)’ a été remplacée par la syntaxe de jointure externe ISO 99.

5
Otávio Décio