2010-10-26 13 views
117

Estoy revisando algunas declaraciones SQL antiguas con el fin de documentarlas y probablemente mejorarlas.Oracle "(+)" Operador

El DBMS es Oracle

no entendía una declaración que decía así:

select ... 
from a,b 
where a.id=b.id(+) 

Me gustaría saber el operador (+), y no podía conseguir en cualquier foro ... (buscar + entre comillas tampoco funcionó).

De todos modos, he usado 'explicar el plan' de SQLDeveloper y me dieron una salida diciendo que HASH JOIN, RIGHT OUTER, etc.

Habría alguna diferencia si quito 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 usar (+)? Sería de gran ayuda si me puede proporcionar una comprensión simple, o algunos buenos enlaces donde pueda leer sobre esto.

Gracias!

Respuesta

147

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 podría ser reescrita en la sintaxis ANSI-92 como:

SELECT ... 
    FROM a 
LEFT JOIN b ON b.id = a.id 

This link is pretty good at explaining the difference between JOINs.


También hay que señalar que a pesar de que las obras, (+)Oracle recommends not using it:

Oracle recomienda utilizar la sintaxis FROM cláusula OUTER JOIN en lugar de unirse a Oracle el operador. Combinación externa consultas que utilizan el Oracle operador de combinación (+) están sujetos a las siguientes reglas y restricciones, que no se aplican a la sintaxis FROM cláusula OUTER JOIN:

+0

Oh, gracias! - ¡No esperaba eso en absoluto! – Sekhar

+60

Exactamente a la derecha. Para mantener el (+) recto en mi cabeza (lado izquierdo vs. lado derecho), me gusta pensar en (+) como "agregar valores NULL si no se encuentra una coincidencia". Por ejemplo, "a.id = b.id (+)" significa que permite que b.id sea NULL si no coincide con a.id. – beach

+0

gracias ... Supongo que agregarlo en la cláusula debería dar el mismo resultado. –

24

El (+) indica operador de una combinación externa. Esto significa que Oracle aún devolverá registros desde el otro lado de la unión, incluso cuando no coincida. Por ejemplo, si a y b son emp y departamento y puede hacer que los empleados no se asignen a un departamento, la siguiente declaración mostrará los detalles de todos los empleados, ya sea que hayan sido asignados a un departamento o no.

select * from emp, dept where emp.dept_id=dept.dept_id(+) 

Así que en resumen, la eliminación de la (+) podrá hacer una diferencia significativa, pero es posible que no se dé cuenta por un tiempo dependiendo de sus datos!

5

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 tiene permitido contener valores vacíos o nulos dentro del condicional).

8

En Oracle, (+) denota la tabla "opcional" en el JOIN.Así que en la 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 IZQUIERDA EXTERIOR 'b' con 'a' mesa. Al igual que la consulta de combinación izquierda moderna. (Se vuelve todos los datos de 'a' mesa sin perder sus datos en el otro lado opcional de la tabla 'b' puede perdido sus datos) enter image description here

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 se quita (+), entonces será normal interior consulta de unión,

select a.id, b.id, a.col_2, b.col_2, ... 
from a,b 
where a.id=b.id 

enter image description here

solo devolverá todos los datos donde tanto 'a' & 'b' tables 'id' sea el mismo valor, significa parte común.

adicional: Si desea hacer su consulta como derecho se unen en el formato antiguo o moderno, entonces aparecerá como como abajo:

enter image description here

antigua:

select a.id, b.id, a.col_2, b.col_2, ... 
from a,b 
where a.id(+)=b.id 

moderna:

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 & ayuda:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Left Outer Join using + sign in Oracle 11g

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