transponer registros operadores multiple logicos funciones ejemplos developer consultas comandos columns columnas sql oracle join outer-join

sql - operadores - oracle transponer registros columnas



Operador "(+)" de Oracle (4)

El operador (+) indica 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(+)

En resumen, eliminar el (+) puede significar una diferencia significativa, pero es posible que no lo note por un tiempo, según sus datos.

Estoy revisando algunas declaraciones SQL antiguas con el fin 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 obtenerlo en ningún foro ... (tampoco funcionó buscar + entre comillas).

De todos modos, utilicé ''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 cumplir alguna condición (como tener algunos índices, etc.) antes de que se pueda usar (+) ? Sería de gran ayuda si me puede proporcionar una comprensión simple, o algunos buenos enlaces donde pueda leer sobre esto.

¡Gracias!


En Oracle, (+) denota la tabla "opcional" en JOIN. Entonces en tu consulta,

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

es una mesa IZQUIERDA EXTERIOR ''b'' con ''a'' mesa. Al igual que la consulta de combinación izquierda moderna. (Devolverá todos los datos de la tabla ''a'' sin perder sus datos en el otro lado; 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 eliminas (+) entonces será una consulta de unión interna normal,

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

solo devolverá todos los datos donde el valor ''id'' de las tablas ''a'' y ''b'' sea el mismo, significa parte común.

Extra: si desea hacer que su consulta sea correcta, únase a un formato anterior o moderno, entonces aparecerá como abajo:

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

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

Left Outer Join usando el signo + en Oracle 11g

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


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).


Esa es la notación específica de Oracle para OUTER JOIN, porque el formato ANSI-89 (usando una coma en la cláusula FROM para separar las referencias de la tabla) no estandarizaba las uniones OUTER.

La consulta se volvería a escribir 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 se debe tener en cuenta que aunque el (+) funciona, Oracle recomienda no usarlo :

Oracle recomienda que utilice la sintaxis OUTER JOIN cláusula FROM lugar del operador de unión de Oracle. Las consultas de unión externa que utilizan el operador de unión de Oracle (+) están sujetas a las siguientes reglas y restricciones, que no se aplican a la sintaxis OUTER JOIN cláusula FROM :