Sunteți pe pagina 1din 11

IZQUIERDA COMBINACIÓN EXTERNA

A LEFT [OUTER] JOINdevuelve todas las filas válidas de la tabla en el lado izquierdo
de la JOINpalabra clave, junto con los valores de la tabla en el lado derecho, o NULL
si no existe una fila coincidente.

Usando el ejemplo anterior, pero cambiando a un LEFT OUTER JOINmedio, veremos


el departamento de OPERACIONES, a pesar de que no tiene empleados.

Aquí hay un ejemplo de un ANSI LEFT OUTER JOIN.

SELECCIONE d.department_name,
e.employee_name
DE departamentos d
IZQUIERDA EXTERIOR ÚNETE a los empleados e ON d.department_id =
e.department_id
WHERE d.department_id> = 30
ORDER BY d.department_name, e.employee_name;

DEPARTMENT_NAM EMPLOYEE_N
-------------- ----------
Operaciones
VENTAS ALLEN
VENTA BLAKE
VENTAS JAMES
VENTAS MARTIN
TURNER DE VENTAS
SALA DE VENTAS

7 filas seleccionadas.

SQL>

Aquí está el equivalente no ANSI de la declaración anterior. Observe que el "(+)" se


usa para indicar el lado de la condición de unión que puede faltar. Para una
condición de unión de varias columnas, cada columna debe tener el "(+)"
presente. A diferencia de la sintaxis de unión ANSI, la sintaxis de unión no ANSI no
se ve afectada por el orden de las tablas.
SELECCIONE d.department_name,
e.employee_name
DE los departamentos d, empleados e
DONDE d.department_id = e.department_id (+)
Y d.department_id> = 30
ORDER BY d.department_name, e.employee_name;

DEPARTMENT_NAM EMPLOYEE_N
-------------- ----------
Operaciones
VENTAS ALLEN
VENTA BLAKE
VENTAS JAMES
VENTAS MARTIN
TURNER DE VENTAS
SALA DE VENTAS

7 filas seleccionadas.

SQL>

Agregar filtros a las columnas devueltas desde una tabla unida externa es una
causa común de confusión. Si prueba un valor específico, por ejemplo "salario> =
2000", pero el valor de la columna SALARIO es NULL porque falta la fila, una
condición regular en la cláusula WHERE arrojará la fila, por lo tanto, derrota el
objeto de haciendo una unión externa. Los métodos ANSI y no ANSI tienen una
forma de lidiar con esto.

Usando la sintaxis de unión ANSI, los filtros en las columnas de la tabla unida
externa se incluyen en la propia unión, en lugar de colocarse en la WHEREcláusula.

SELECCIONE d.department_name,
e.employee_name
DE departamentos d
IZQUIERDA EXTERIOR ÚNETE a los empleados e ON d.department_id =
e.department_id Y e.salary> = 2000
WHERE d.department_id> = 30
ORDER BY d.department_name, e.employee_name;

DEPARTMENT_NAM EMPLOYEE_N
-------------- ----------
Operaciones
VENTA BLAKE

2 filas seleccionadas.

SQL>
Usando la sintaxis de unión no ANSI, el "(+)" se usa para indicar que una columna
puede tener un valor NULL como resultado de una unión externa.

SELECCIONE d.department_name,
e.employee_name
DE departamentos d, empleados e
WHERE d.department_id = e.department_id (+)
Y e.salario (+)> = 2000
Y d.department_id> = 30
ORDER BY d.department_name, e.employee_name;

DEPARTMENT_NAM EMPLOYEE_N
-------------- ----------
Operaciones
VENTA BLAKE

2 filas seleccionadas.

SQL>

DERECHA [EXTERIOR] ÚNETE


El RIGHT [OUTER] JOINes lo opuesto al LEFT [OUTER] JOIN. Devuelve todas las filas
válidas de la tabla en el lado derecho de la JOINpalabra clave, junto con los valores
de la tabla en el lado izquierdo, o NULL si no existe una fila coincidente. Todos los
puntos planteados en la sección anterior se aplican aquí también.

El siguiente ejemplo ha alterado el orden de las tablas, por RIGHT [OUTER] JOINlo


que ahora se requiere a.

SELECCIONE d.department_name,
e.employee_name
DE empleados e
DERECHA EXTERIOR UNIRSE a los departamentos d ON e.department_id =
d.department_id
WHERE d.department_id> = 30
ORDER BY d.department_name, e.employee_name;
DEPARTMENT_NAM EMPLOYEE_N
-------------- ----------
Operaciones
VENTAS ALLEN
VENTA BLAKE
VENTAS JAMES
VENTAS MARTIN
TURNER DE VENTAS
SALA DE VENTAS

7 filas seleccionadas.

SQL>

Recuerde, la sintaxis de combinación externa no ANSI no depende del orden de la


tabla, por lo que no existe un concepto real de combinaciones externas derecha o
izquierda, solo combinaciones externas.

COMPLETO [EXTERIOR] ÚNASE


A FULL [OUTER] JOINcombina todas las filas de las tablas en los lados izquierdo y
derecho de la unión. Si hay una coincidencia convencional, se hace. Si alguno de
los lados tiene datos faltantes, se reemplaza por NULL, en lugar de tirar la fila.

Para ver un ejemplo de trabajo, necesitamos agregar otro empleado que no esté
asignado a un departamento.

INSERTAR EN LOS VALORES de los empleados (8888, 'JONES', 'DBA', nulo,


to_date ('02 -1-1982 ',' dd-mm-aaaa '), 1300, NULL, NULL);
COMETER;

Aquí hay un ejemplo de un ANSI FULL OUTER JOIN.

SELECCIONE d.department_name,
e.employee_name
DE empleados e
FULL OUTER JOIN departamentos d ON e.department_id = d.department_id
ORDER BY d.department_name, e.employee_name;

DEPARTMENT_NAM EMPLOYEE_N
-------------- ----------
CLARK CONTABLE
REY CONTABLE
MOLINO CONTABLE
Operaciones
ADAMS DE INVESTIGACIÓN
FORD DE INVESTIGACIÓN
INVESTIGACIÓN JONES
INVESTIGACIÓN SCOTT
INVESTIGACIÓN SMITH
VENTAS ALLEN
VENTA BLAKE
VENTAS JAMES
VENTAS MARTIN
TURNER DE VENTAS
SALA DE VENTAS
JONES

16 filas seleccionadas.

SQL>

No existe un equivalente directo de una combinación externa completa utilizando


la sintaxis de combinación que no sea ANSI, pero podemos recrearla combinando
dos consultas de combinación externa utilizando a UNION ALL, como se muestra a
continuación.

SELECCIONE d.department_name,
e.employee_name
DE empleados e, departamentos d
DONDE e.department_id = d.department_id (+)
UNIÓN TODO
SELECCIONE d.department_name,
e.employee_name
DE departamentos d, empleados e
WHERE d.department_id = e.department_id (+)
Y e.employee_name ES NULO
ORDEN POR 1, 2;

DEPARTMENT_NAM EMPLOYEE_N
-------------- ----------
CLARK CONTABLE
REY CONTABLE
MOLINO CONTABLE
Operaciones
ADAMS DE INVESTIGACIÓN
FORD DE INVESTIGACIÓN
INVESTIGACIÓN JONES
INVESTIGACIÓN SCOTT
INVESTIGACIÓN SMITH
VENTAS ALLEN
VENTA BLAKE
VENTAS JAMES
VENTAS MARTIN
TURNER DE VENTAS
SALA DE VENTAS
JONES

16 filas seleccionadas.

SQL>

Curiosamente, cuando ejecuta un ANSI FULL OUTER JOIN, el optimizador de Oracle


lo reescribe en un equivalente de unión que no sea ANSI, por lo que no hay una
mejora de rendimiento asociada con él. Es más fácil a la vista.

Eliminemos ese empleado adicional para que no afecte a ningún otro ejemplo.

BORRAR DE empleados DONDE employee_id = 8888;


COMETER;

CROSS JOIN
A CROSS JOINes la creación deliberada de un producto cartesiano. No hay columnas
de unión especificadas, por lo que se producen todas las combinaciones posibles
de filas entre las dos tablas.

Aquí hay un ejemplo de un ANSI CROSS JOIN.

SELECCIONE e.employee_name,
d.department_name
DE empleados e
CROSS JOIN departamentos d
ORDER BY e.employee_name, d.department_name;

EMPLEADO_N DEPARTAMENTO_NAM
---------- --------------
CONTABILIDAD DE ADAMS
OPERACIONES DE ADAMS
INVESTIGACIÓN ADAMS
VENTAS ADAMS

... Salida modificada por brevedad ...

CONTABILIDAD
OPERACIONES DE SALUD
Investigación de barrio
VENTAS

56 filas seleccionadas.

SQL>

Aquí está el equivalente no ANSI de la declaración anterior. Tenga en cuenta que


no hay condiciones de unión en la WHEREcláusula.

SELECCIONE e.employee_name,
d.department_name
DE empleados e, departamentos d
ORDER BY e.employee_name, d.department_name;

EMPLEADO_N DEPARTAMENTO_NAM
---------- --------------
CONTABILIDAD DE ADAMS
OPERACIONES DE ADAMS
INVESTIGACIÓN ADAMS
VENTAS ADAMS

... Salida modificada por brevedad ...

CONTABILIDAD
OPERACIONES DE SALUD
Investigación de barrio
VENTAS

56 filas seleccionadas.

SQL>

UNIÓN NATURAL
A NATURAL JOINes una variante de un INNER JOIN. Las columnas de unión se
determinan implícitamente, en función de los nombres de las columnas. Se supone
que las columnas que comparten el mismo nombre entre las dos tablas son
columnas de unión. Aquí hay un ejemplo usando la sintaxis de unión ANSI.

SELECCIONE e.employee_name,
d.department_name
DE empleados e
UNIÓN NATURAL departamentos d
ORDER BY e.employee_name, d.department_name;

EMPLEADO_N DEPARTAMENTO_NAM
---------- --------------
INVESTIGACIÓN ADAMS
VENTAS ALLEN
VENTAS BLAKE
CLARK CONTABLE
INVESTIGACIÓN FORD
VENTAS DE JAMES
INVESTIGACIÓN JONES
CONTABILIDAD DEL REY
VENTAS MARTIN
MILLER CONTABLE
INVESTIGACIÓN SCOTT
INVESTIGACIÓN SMITH
VENTAS DE TURNER
VENTAS

14 filas seleccionadas.

SQL>

No existe un equivalente que no sea ANSI, ya que se deben especificar todas las
condiciones de unión.

Usar a NATURAL JOINes una mala idea. Si alguien agrega una nueva columna a una
de las tablas que tiene el mismo nombre que una columna en la otra tabla, puede
romper cualquier unión natural existente. Es efectivamente un error esperando a
suceder.

No puede aplicar ningún filtro con alias a las columnas utilizadas en las
combinaciones naturales, como se muestra en el siguiente ejemplo.

SELECCIONE e.employee_name,
d.department_name
DE empleados e
UNIÓN NATURAL departamentos d
WHERE d.department_id = 20
ORDER BY e.employee_name;

WHERE d.department_id = 20
* *
ERROR en la línea 5:
ORA-25155: la columna utilizada en la unión NATURAL no puede tener
calificador

SQL>

En su lugar, debe eliminar el alias, que en otras circunstancias daría lugar a un error
de referencia ambiguo.

SELECCIONE e.employee_name,
d.department_name
DE empleados e
UNIÓN NATURAL departamentos d
DONDE departamento_id = 20
ORDER BY e.employee_name;

EMPLEADO_N DEPARTAMENTO_NAM
---------- --------------
INVESTIGACIÓN ADAMS
INVESTIGACIÓN FORD
INVESTIGACIÓN JONES
INVESTIGACIÓN SCOTT
INVESTIGACIÓN SMITH

5 filas seleccionadas.

SQL>

[INTERIOR] ÚNASE ... USANDO


El INNER JOIN ... USINGes casi una casa a medio camino entre un
convencional INNER JOINy un NATURAL JOIN. La unión se realiza utilizando columnas
con nombres coincidentes en cada tabla, pero debe especificar las columnas que se
utilizarán, no la condición completa. Esto le permite unirse en un subconjunto de
las columnas comunes a ambas tablas.

SELECCIONE e.employee_name,
d.department_name
DE empleados e
ÚNETE departamentos d USING (departamento_id)
ORDER BY e.employee_name;
EMPLEADO_N DEPARTAMENTO_NAM
---------- --------------
INVESTIGACIÓN ADAMS
VENTAS ALLEN
VENTAS BLAKE
CLARK CONTABLE
INVESTIGACIÓN FORD
VENTAS DE JAMES
INVESTIGACIÓN JONES
CONTABILIDAD DEL REY
VENTAS MARTIN
MILLER CONTABLE
INVESTIGACIÓN SCOTT
INVESTIGACIÓN SMITH
VENTAS DE TURNER
VENTAS

14 filas seleccionadas.

SQL>

Esta es una sintaxis de unión segura, ya que no puede verse afectada por la adición
de columnas a cualquiera de las tablas. De forma similar al NATURAL JOIN, no puede
aplicar ningún filtro con alias a las columnas utilizadas en la unión, pero si elimina
el alias funciona.

SELECCIONE e.employee_name,
d.department_name
DE empleados e
ÚNETE departamentos d USING (departamento_id)
WHERE d.department_id = 20
ORDER BY e.employee_name;

WHERE d.department_id = 20
* *
ERROR en la línea 5:
ORA-25154: la parte de la columna de la cláusula USING no puede tener
calificador

SQL>

SELECCIONE e.employee_name,
d.department_name
DE empleados e
ÚNETE departamentos d USING (departamento_id)
DONDE departamento_id = 20
ORDER BY e.employee_name;
EMPLEADO_N DEPARTAMENTO_NAM
---------- --------------
INVESTIGACIÓN ADAMS
INVESTIGACIÓN FORD
INVESTIGACIÓN JONES
INVESTIGACIÓN SCOTT
INVESTIGACIÓN SMITH

5 filas seleccionadas.

SQL>

Uniones adicionales
Las combinaciones CROSS APPLY y OUTER APPLY están disponibles en Oracle, pero
solo se admiten para su uso en el código de su aplicación desde Oracle 12c en
adelante, por lo que es poco probable que las vea en el código de la aplicación
durante algún tiempo.

Para más información, ver:

 SQL para principiantes (Parte 5): Uniones 


 SQL para principiantes - Lista de reproducción completa  
 Artículos de Oracle SQL: Primeros pasos
 Referencia del lenguaje SQL de la base de datos: SELECT
 Vistas en línea LATERALES, APLICACIÓN CRUZADA y APLICACIÓN EXTERIOR
Se une a Oracle Database 12c versión 1 (12.1)

S-ar putea să vă placă și