sql - subconsultas - relacionar dos tablas en oracle
Oracle: ¿Qué hace `(+)` en una cláusula WHERE? (3)
Como otros han declarado, la sintaxis (+)
es una sintaxis obsoleta y patentada que Oracle usó durante años para lograr los mismos resultados que una OUTER JOIN
. Supongo que adoptaron su sintaxis patentada antes de que SQL-92 decidiera la sintaxis estándar.
La consulta equivalente a la que mostró, utilizando la sintaxis SQL OUTER JOIN
estándar (que ahora es compatible con todas las principales implementaciones RDBMS) sería la siguiente:
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;
Lo que significa:
- Todas las filas de la
Table1
se incluyen en el resultado de la consulta. - Donde hay filas coincidentes en la
Table2
, incluya esas filas (repitiendo el contenido de laTable1
si hay múltiples filas coincidentes en laTable2
). - Donde no hay filas coincidentes en la
Table2
, useNULL
para todas las columnas deTable2
en el resultado de la consulta.
Encontré lo siguiente en una aplicación basada en Oracle que estamos migrando (generalizada) :
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é hace (+)
en una cláusula WHERE? Nunca lo había visto usado así antes.
Dependiendo de qué lado del "=" el "(+) está encendido, denota un EXTREMO IZQUIERDO o un EXTREMO DERECHO (en este caso, es una combinación externa izquierda). Es la sintaxis de Oracle antigua que a veces prefieren las personas que Lo aprendí primero, ya que les gusta eso hace que su código sea más corto.
Sin embargo, es mejor no usarlo, por razones de legibilidad.
Es una notación de combinación externa izquierda no ANSI. Comenzando con Oracle9i, la sintaxis de combinación externa confusa usando la notación ''(+)'' ha sido reemplazada por la sintaxis de combinación externa ISO 99.