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.
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é.
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:
Table1
Sont incluses dans le résultat de la requête.Table2
, Incluez ces lignes (en répétant le contenu de Table1
S'il y a plusieurs lignes correspondantes dans Table2
).Table2
, Utilisez NULL
pour toutes les colonnes de Table2
Dans le résultat de la requête.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.