tablas subconsultas relacionar ejemplos consultas avanzadas agrupadas sql oracle operators

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 la Table1 si hay múltiples filas coincidentes en la Table2 ).
  • Donde no hay filas coincidentes en la Table2 , use NULL para todas las columnas de Table2 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.