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!

Author: Óscar Gómez Alcañiz, 2010-10-26

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áusula OUTER 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áusula FROM OUTER JOIN:

 157
Author: OMG Ponies,
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!

 24
Author: hot dog,
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 ) introduzca la descripción de la imagen aquí

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

introduzca la descripción de la imagen aquí

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:

introduzca la descripción de la imagen aquí

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

Unión externa izquierda usando + iniciar sesión Oracle 11g

Https://www.w3schools.com/sql/sql_join_left.asp

 14
Author: Md. Salman Fahad Famous,
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).

 5
Author: sunny,
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