Oracle "(+)" Operador
Estoy revisando algunas sentencias 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 acerca del operador (+)
, y no pude obtenerlo en ningún foro... (la búsqueda de + entre comillas tampoco funcionó).
De todos modos, usé 'Explain Plan' de SQLDeveloper y obtuve una salida diciendo que HASH JOIN, RIGHT OUTER
, etc.
Habría alguna diferencia si elimino el operador (+)
al final de la consulta? ¿La base de datos tiene que satisfacer alguna condición (como tener algunos índices, etc.) antes de usar (+)
?? Sería de gran ayuda si me puede proporcionar una comprensión simple, o algunos buenos enlaces donde puedo leer sobre esto.
Gracias!
4 answers
Esa es la notación específica de Oracle para una UNIÓN EXTERNA, porque el formato ANSI-89 (usando una coma en la cláusula FROM para separar las referencias de la tabla) no estandarizó las uniones EXTERNAS.
La consulta sería reescrita en sintaxis ANSI-92 como:
SELECT ...
FROM a
LEFT JOIN b ON b.id = a.id
Este enlace es bastante bueno para explicar la diferencia entre JOINs .
También debe tenerse en cuenta que a pesar de que el (+)
funciona, Oracle recomienda no usarlo :
Oracle recomienda que utilice la sintaxis
FROM
de la cláusulaOUTER JOIN
en lugar del operador de unión de Oracle. Las consultas de unión externa que utilizan el operador de unión Oracle(+)
están sujetas a las siguientes reglas y restricciones, que no se aplican a la sintaxis de la cláusulaFROM
OUTER JOIN
:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-31 18:40:35
El operador (+) indica una unión externa. Esto significa que Oracle todavía devolverá los registros del otro lado de la unión, incluso cuando no hay coincidencia. Por ejemplo, si a y b son emp y dept y puede tener empleados sin asignar a un departamento, la siguiente declaración devolverá los detalles de todos los empleados, ya sea que hayan sido asignados o no a un departamento.
select * from emp, dept where emp.dept_id=dept.dept_id(+)
Así que en resumen, eliminar el ( + ) puede hacer una diferencia significativa, pero es posible que no lo note por un tiempo dependiendo de sus datos!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-22 12:09:16
En Oracle, (+) denota la tabla "opcional" en la COMBINACIÓN. Así que en su consulta,
select a.id, b.id, a.col_2, b.col_2, ...
from a,b
where a.id=b.id(+)
Es una tabla de UNIÓN EXTERNA IZQUIERDA 'b' con una tabla 'a'. As like modern left join query. (devuelve todos los datos de la tabla ' a 'sin perder sus datos en el otro lado de la tabla opcional' b ' puede perder sus datos )
select a.id, b.id, a.col_2, b.col_2, ...
from a
Left join b ON a.id=b.id
O
select a.id, b.id, a.col_2, b.col_2, ...
from a
Left join b using(id)
Ahora, si elimina ( + ), entonces será una consulta interna normal,
select a.id, b.id, a.col_2, b.col_2, ...
from a,b
where a.id=b.id
Solo devuelve todos datos donde el valor " id " de ambas tablas 'a' y 'b' es el mismo, significa parte común.
Extra: Si desea hacer su consulta como Unión correcta en formato antiguo o moderno, aparecerá como a continuación:
Antiguo:
select a.id, b.id, a.col_2, b.col_2, ...
from a,b
where a.id(+)=b.id
Moderno:
select a.id, b.id, a.col_2, b.col_2, ...
from a
Right join b ON a.id=b.id
O
select a.id, b.id, a.col_2, b.col_2, ...
from a
Right join b using(id)
Ref & help:
Https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-30 05:48:03
En la práctica, el símbolo + se coloca directamente en la instrucción condicional y en el lado de la tabla opcional (la que puede contener valores vacíos o nulos dentro de la condicional).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-02 17:21:45