Estoy revisando algunas declaraciones SQL antiguas con el propósito de documentarlas y probablemente mejorarlas.
El DBMS es Oracle
No entendí una declaración que decía así:
select ...
from a,b
where a.id=b.id(+)
Estoy confundido sobre el (+)
operador, y no pude encontrarlo en ningún foro ... (la búsqueda de + entre comillas tampoco funcionó).
De todos modos, usé 'Explain Plan' de SQLDeveloper y obtuve un resultado que decía eso HASH JOIN, RIGHT OUTER
, etc.
¿Habría alguna diferencia si elimino el (+)
operador al final de la consulta? ¿La base de datos tiene que cumplir alguna condición (como tener algunos índices, etc.) antes de (+)
poder usarse? Sería de gran ayuda si me puede proporcionar una comprensión simple, o algunos buenos enlaces donde puedo leer sobre esto.
¡Gracias!
sql
oracle
join
outer-join
Sekhar
fuente
fuente
Respuestas:
Esa es la notación específica de Oracle para un OUTER JOIN, porque el formato ANSI-89 (usando una coma en la cláusula FROM para separar las referencias de tabla) no estandarizó las uniones OUTER.
La consulta se volvería a escribir en la sintaxis ANSI-92 como:
Este enlace es bastante bueno para explicar la diferencia entre JOIN .
También debe tenerse en cuenta que a pesar de que
(+)
funciona, Oracle recomienda no usarlo :fuente
El operador (+) indica una unión externa. Esto significa que Oracle aún devolverá registros del otro lado de la unión, incluso cuando no haya coincidencia. Por ejemplo, si ayb son emp y dept y usted puede tener empleados no asignados a un departamento, la siguiente declaración devolverá detalles de todos los empleados, ya sea que hayan sido asignados o no a un departamento.
En resumen, eliminar el (+) puede marcar una diferencia significativa, ¡pero es posible que no lo notes por un tiempo dependiendo de tus datos!
fuente
En Oracle, (+) denota la tabla "opcional" en JOIN. Entonces en tu consulta,
es una IZQUIERDA EXTERIOR IZQUIERDA de la tabla 'b' a la tabla 'a'. Devolverá todos los datos de la tabla 'a' sin perder sus datos cuando el otro lado (tabla opcional 'b') no tenga datos.
La sintaxis estándar moderna para la misma consulta sería
o con una abreviatura de
a.id=b.id
(no compatible con todas las bases de datos):Si elimina (+), será una consulta de unión interna normal
Sintaxis anterior, tanto en Oracle como en otras bases de datos:
Sintaxis más moderna:
O simplemente:
Solo devolverá todos los datos donde el valor 'id' de las tablas 'a' y 'b' sea el mismo, significa parte común.
Si desea hacer que su consulta sea correcta
Esto es lo mismo que un LEFT JOIN, pero cambia qué tabla es opcional.
Antigua sintaxis de Oracle:
Sintaxis estándar moderna:
Ref y ayuda:
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187
Unión externa izquierda usando el signo + en Oracle 11g
https://www.w3schools.com/sql/sql_join_left.asp
fuente
En la práctica, el símbolo + se coloca directamente en la declaración condicional y en el lado de la tabla opcional (la que puede contener valores vacíos o nulos dentro del condicional).
fuente