Documente Academic
Documente Profesional
Documente Cultură
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.
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>
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>
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>
Para ver un ejemplo de trabajo, necesitamos agregar otro empleado que no esté
asignado a un departamento.
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>
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>
Eliminemos ese empleado adicional para que no afecte a ningún otro ejemplo.
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.
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
CONTABILIDAD
OPERACIONES DE SALUD
Investigación de barrio
VENTAS
56 filas seleccionadas.
SQL>
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
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>
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.