Unirse (SQL)

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Cláusula SQL
Un diagrama Venn que representa la declaración completa de SQL entre tablas A y B.

Una cláusula join en el lenguaje de consulta estructurado (SQL) combina columnas de una o más tablas en una nueva tabla. La operación corresponde a una operación de unión en álgebra relacional. De manera informal, una unión une dos tablas y coloca en la misma fila registros con campos coincidentes: INNER, LEFT OUTER, RIGHT OUTER, EXTERIOR COMPLETO y CRUZ.

Tablas de ejemplo

Para explicar los tipos de unión, el resto de este artículo utiliza las siguientes tablas:

Cuadro de empleados
LastNameDepartmentID
Rafferty31
Jones33
Heisenberg33
Robinson34
Smith34
WilliamsNULL
Cuadro de servicios
DepartmentIDDepartmentName
31Ventas
33Ingeniería
34Clerical
35Marketing

Department.DepartmentID es la clave principal de la tabla Department, mientras que Employee.DepartmentID es una clave externa.

Tenga en cuenta que en Empleado, "Williams" Aún no ha sido asignado a ningún departamento. Además, no se ha asignado ningún empleado al área de "Marketing" departamento.

Estas son las declaraciones SQL para crear las tablas anteriores:

CREATE CUADRO Departamento() DepartmentID INT PRIMARÍA KEY NO NULL, DepartmentName VARCHAR()20));CREATE CUADRO empleado () LastName VARCHAR()20), DepartmentID INT REFERENCIAS Departamento()DepartmentID));INSERT INTO DepartamentoVALUES ()31, "Ventas" '), ()33, Engineering '), ()34, 'Clerical' '), ()35, 'Marketing ');INSERT INTO empleadoVALUES ()"Rafferty" ', 31), ()'Jones ', 33), ()Heisenberg ', 33), ()'Robinson ', 34), ()'Smith ', 34), ()'Williams ', NULL);

Cross Join

CROSS JOIN devuelve el producto cartesiano de filas de tablas en la unión. En otras palabras, producirá filas que combinan cada fila de la primera tabla con cada fila de la segunda tabla.

Empleado.Empleado.DepartmentIDDepartment.DepartmentNameDepartment.DepartmentID
Rafferty31Ventas31
Jones33Ventas31
Heisenberg33Ventas31
Smith34Ventas31
Robinson34Ventas31
WilliamsNULLVentas31
Rafferty31Ingeniería33
Jones33Ingeniería33
Heisenberg33Ingeniería33
Smith34Ingeniería33
Robinson34Ingeniería33
WilliamsNULLIngeniería33
Rafferty31Clerical34
Jones33Clerical34
Heisenberg33Clerical34
Smith34Clerical34
Robinson34Clerical34
WilliamsNULLClerical34
Rafferty31Marketing35
Jones33Marketing35
Heisenberg33Marketing35
Smith34Marketing35
Robinson34Marketing35
WilliamsNULLMarketing35

Ejemplo de una unión cruzada explícita:

SELECT *DESDE empleado CROSS Únete Departamento;

Ejemplo de unión cruzada implícita:

SELECT *DESDE empleado, Departamento;

La unión cruzada se puede reemplazar con una unión interna con una condición siempre verdadera:

SELECT *DESDE empleado INNER Únete Departamento ON 1=1;

CROSS JOIN no aplica ningún predicado para filtrar filas de la tabla unida. Los resultados de una CROSS JOIN se pueden filtrar usando una cláusula WHERE, que luego puede producir el equivalente de una unión interna.

En el estándar SQL:2011, las uniones cruzadas son parte del paquete opcional F401, "Tabla unida extendida".

Los usos normales son para comprobar el rendimiento del servidor.

Unión interna

Una unión interna (o unión) requiere que cada fila de las dos tablas unidas tenga valores de columna coincidentes, y es una operación de unión comúnmente utilizada en aplicaciones, pero no debería Se supone que es la mejor opción en todas las situaciones. La combinación interna crea una nueva tabla de resultados combinando los valores de las columnas de dos tablas (A y B) según el predicado de la combinación. La consulta compara cada fila de A con cada fila de B para encontrar todos los pares de filas que satisfacen el predicado de unión. Cuando el predicado de unión se satisface al hacer coincidir valores no NULL, los valores de columna para cada par de filas coincidentes de A y B se combinan en una fila de resultado.

El resultado de la unión se puede definir como el resultado de tomar primero el producto cartesiano (o unión cruzada) de todas las filas de las tablas (combinando cada fila de la tabla A con cada fila de la tabla B) y luego devolver todas las filas. que satisfacen el predicado de unión. Las implementaciones reales de SQL normalmente utilizan otros enfoques, como uniones hash o uniones tipo-fusión, ya que calcular el producto cartesiano es más lento y a menudo requeriría una cantidad prohibitiva de memoria para almacenar.

SQL especifica dos formas sintácticas diferentes de expresar uniones: la "notación de unión explícita" y la "notación de unión implícita". La "notación de unión implícita" Ya no se considera una mejor práctica, aunque los sistemas de bases de datos todavía lo admiten.

La "notación de unión explícita" utiliza la palabra clave JOIN, opcionalmente precedida por la palabra clave INNER, para especificar la tabla a unir, y la palabra clave ON para especificar los predicados para la tabla. unirse, como en el siguiente ejemplo:

SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentName DESDE empleado INNER Únete Departamento ONempleado.DepartmentID = Departamento.DepartmentID;
Empleado.Empleado.DepartmentIDDepartment.DepartmentName
Robinson34Clerical
Jones33Ingeniería
Smith34Clerical
Heisenberg33Ingeniería
Rafferty31Ventas

La "notación de unión implícita" simplemente enumera las tablas para unir, en la cláusula FROM de la instrucción SELECT, usando comas para separarlas. Por lo tanto, especifica una unión cruzada, y la cláusula WHERE puede aplicar predicados de filtro adicionales (que funcionan de manera comparable a los predicados de unión en la notación explícita).

El siguiente ejemplo es equivalente al anterior, pero esta vez usando notación de unión implícita:

SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentName DESDE empleado, DepartamentoDonde empleado.DepartmentID = Departamento.DepartmentID;

Las consultas dadas en los ejemplos anteriores unirán las tablas de Empleados y departamentos usando la columna ID de Departamento de ambas tablas. Cuando el ID de departamento de estas tablas coincide (es decir, se cumple el predicado de unión), la consulta combinará las columnas Apellido, ID de departamento y Nombre de departamento de las dos tablas en una fila de resultados. Cuando el ID del departamento no coincide, no se genera ninguna fila de resultados.

Así el resultado de la ejecución de la consulta anterior será:

Empleado.Empleado.DepartmentIDDepartment.DepartmentName
Robinson34Clerical
Jones33Ingeniería
Smith34Clerical
Heisenberg33Ingeniería
Rafferty31Ventas

El empleado "Williams" y el departamento "Marketing" no aparecen en los resultados de ejecución de la consulta. Ninguno de estos tiene filas coincidentes en la otra tabla respectiva: "Williams" no tiene ningún departamento asociado y ningún empleado tiene el ID de departamento 35 ("Marketing"). Dependiendo de los resultados deseados, este comportamiento puede ser un error sutil, que se puede evitar reemplazando la unión interna por una unión externa.

Unión interna y valores NULL

Los programadores deben tener especial cuidado al unir tablas en columnas que pueden contener valores NULL, ya que NULL nunca coincidirá con ningún otro valor (ni siquiera el propio NULL), a menos que la condición de unión utilice explícitamente un predicado de combinación que primero verifique que las columnas se unan. son NOT NULL antes de aplicar las condiciones de predicado restantes. La unión interna solo se puede utilizar de forma segura en una base de datos que aplique integridad referencial o donde se garantice que las columnas de unión no serán NULL. Muchas bases de datos relacionales de procesamiento de transacciones se basan en estándares de actualización de datos de atomicidad, coherencia, aislamiento y durabilidad (ACID) para garantizar la integridad de los datos, lo que hace que las uniones internas sean una opción adecuada. Sin embargo, las bases de datos de transacciones generalmente también tienen columnas de unión deseables que pueden ser NULL. Muchas bases de datos relacionales y almacenes de datos de informes utilizan actualizaciones por lotes de extracción, transformación y carga (ETL) de gran volumen que hacen que la integridad referencial sea difícil o imposible de aplicar, lo que da como resultado columnas de unión potencialmente NULL que un autor de una consulta SQL no puede modificar y que provocan que se omitan las uniones internas. datos sin indicación de error. La elección de utilizar una combinación interna depende del diseño de la base de datos y de las características de los datos. Una combinación externa izquierda generalmente se puede sustituir por una combinación interna cuando las columnas de combinación en una tabla pueden contener valores NULL.

Cualquier columna de datos que pueda ser NULL (vacía) nunca debe usarse como enlace en una combinación interna, a menos que el resultado deseado sea eliminar las filas con el valor NULL. Si las columnas de unión NULL se van a eliminar deliberadamente del conjunto de resultados, una unión interna puede ser más rápida que una unión externa porque la unión de la tabla y el filtrado se realizan en un solo paso. Por el contrario, una unión interna puede provocar un rendimiento desastrosamente lento o incluso una caída del servidor cuando se utiliza en una consulta de gran volumen en combinación con funciones de base de datos en una cláusula Where de SQL. Una función en una cláusula Where de SQL puede hacer que la base de datos ignore índices de tablas relativamente compactos. La base de datos puede leer y unir internamente las columnas seleccionadas de ambas tablas antes de reducir el número de filas usando el filtro que depende de un valor calculado, lo que resulta en una cantidad relativamente enorme de procesamiento ineficiente.

Cuando se produce un conjunto de resultados uniendo varias tablas, incluidas las tablas maestras utilizadas para buscar descripciones de texto completo de códigos de identificación numéricos (una tabla de búsqueda), un valor NULL en cualquiera de las claves foráneas puede dar como resultado el resultado completo. La fila se elimina del conjunto de resultados, sin indicación de error. Una consulta SQL compleja que incluye una o más combinaciones internas y varias combinaciones externas tiene el mismo riesgo de valores NULL en las columnas de enlace de combinación interna.

Un compromiso con el código SQL que contiene combinaciones internas supone que las columnas de combinación NULL no se introducirán en cambios futuros, incluidas actualizaciones de proveedores, cambios de diseño y procesamiento masivo fuera de las reglas de validación de datos de la aplicación, como conversiones de datos, migraciones, importaciones masivas y fusiones.

Se pueden clasificar además las uniones internas como uniones equiuniones, uniones naturales o uniones cruzadas.

Equi-unión

Una equi-join es un tipo específico de unión basada en comparador, que utiliza solo comparaciones de igualdad en el predicado de unión. El uso de otros operadores de comparación (como <) descalifica una unión como equi-unión. La consulta que se muestra arriba ya ha proporcionado un ejemplo de unión equivalente:

SELECT *DESDE empleado Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;

Podemos escribir equi-join como abajo,

SELECT *DESDE empleado, DepartamentoDonde empleado.DepartmentID = Departamento.DepartmentID;

Si las columnas de una combinación equi tienen el mismo nombre, SQL-92 proporciona una notación abreviada opcional para expresar combinaciones equi, mediante la construcción USING:

SELECT *DESDE empleado INNER Únete Departamento Uso ()DepartmentID);

Sin embargo, la construcción USING es más que un mero azúcar sintáctico, ya que el conjunto de resultados difiere del conjunto de resultados de la versión con el predicado explícito. Específicamente, cualquier columna mencionada en la lista USING aparecerá solo una vez, con un nombre no calificado, en lugar de una vez para cada tabla de la combinación. En el caso anterior, habrá una única columna DepartmentID y ninguna employee.DepartmentID o department.DepartmentID.

La cláusula USING no es compatible con MS SQL Server y Sybase.

Unión natural

La unión natural es un caso especial de unión equi. La unión natural (⋈) es un operador binario que se escribe como (RS) donde R y S son relaciones. El resultado de la unión natural es el conjunto de todas las combinaciones de tuplas en R y S que son iguales en sus nombres de atributos comunes. Como ejemplo, considere las tablas Empleado y Depto y su unión natural:

Employee
NombreEmpIdDeptName
Harry.3415Finanzas
Sally2241Ventas
George.3401Finanzas
Harriet2202Ventas
Dept
DeptNameManager
FinanzasGeorge.
VentasHarriet
ProducciónCharles
Employee ⋈ ⋈ {displaystyle bowtie } Dept
NombreEmpIdDeptNameManager
Harry.3415FinanzasGeorge.
Sally2241VentasHarriet
George.3401FinanzasGeorge.
Harriet2202VentasHarriet

Esto también se puede utilizar para definir la composición de las relaciones. Por ejemplo, la composición de Empleado y Depto es su unión como se muestra arriba, proyectada en todos menos en el atributo común DeptName. En la teoría de categorías, la unión es precisamente el producto de fibra.

La unión natural es posiblemente uno de los operadores más importantes ya que es la contraparte relacional del AND lógico. Tenga en cuenta que si la misma variable aparece en cada uno de dos predicados conectados por AND, entonces esa variable representa lo mismo y ambas apariciones siempre deben sustituirse por el mismo valor. En particular, la unión natural permite la combinación de relaciones que están asociadas mediante una clave foránea. Por ejemplo, en el ejemplo anterior una clave externa probablemente va desde Empleado.DeptName hasta Dept.DeptName y luego la unión natural de Empleado y Depto combina a todos los empleados con sus departamentos. Esto funciona porque la clave externa se mantiene entre atributos con el mismo nombre. Si este no es el caso, como en la clave externa de Depto.gerente a Empleado.Nombre, entonces estos Es necesario cambiar el nombre de las columnas antes de realizar la unión natural. A veces, esta combinación también se denomina equi-unión.

Más formalmente, la semántica de la unión natural se define de la siguiente manera:

R⋈ ⋈ S={}t∪ ∪ s▪ ▪ t▪ ▪ R ∧ ∧ s▪ ▪ S ∧ ∧ Fun()t∪ ∪ s)}{displaystyle Rbowtie S=left{tcup smid tin R\\land sin S\\land {mathit {fn}(tcup s)right},

donde Fun es un predicado que es verdadero para una relación r si y sólo si r es una función. Generalmente se requiere que R y S tengan al menos un atributo común, pero si se omite esta restricción, R y S no tienen atributos comunes, entonces la unión natural se convierte exactamente en el producto cartesiano.

La unión natural se puede simular con las primitivas de Codd de la siguiente manera. Sean c1,..., cm los nombres de atributos comunes a R y S, r1,..., rn sean los nombres de atributos exclusivos de R y sean s1,..., sk sean los atributos exclusivos de S. Además, supongamos que los nombres de atributos x1,..., xm no están ni en R ni en S. En un primer paso, ahora se puede cambiar el nombre de los nombres de atributos comunes en S:

T=*** *** x1/c1,... ... ,xm/cm()S)=*** *** x1/c1()*** *** x2/c2()... ... *** *** xm/cm()S)... ... )){displaystyle T=rho ¿Por qué? ¿Por qué? ¿Por qué? ¿Qué?

Luego tomamos el producto cartesiano y seleccionamos las tuplas que se van a unir:

U=π π r1,... ... ,rn,c1,... ... ,cm,s1,... ... ,sk()P){displaystyle U=pi _{1},ldotsr_{n},c_{1},ldotsc_{m},s_{1},ldotss_{k}(P)}

Una unión natural es un tipo de equi-join donde el Únase predicar surge implícitamente comparando todas las columnas en ambas tablas que tienen los mismos nombres de columna en las tablas unidas. La tabla combinada resultante contiene sólo una columna para cada par de columnas igualmente llamadas. En el caso de que no se encuentren columnas con los mismos nombres, el resultado es una unión cruzada.

La mayoría de los expertos coinciden en que los NATURAL JOIN son peligrosos y, por lo tanto, desaconsejan su uso. El peligro proviene de agregar inadvertidamente una nueva columna, con el mismo nombre que otra columna de la otra tabla. Una unión natural existente podría entonces conectarse "naturalmente" use la nueva columna para comparaciones, haciendo comparaciones/coincidencias usando criterios diferentes (de diferentes columnas) que antes. Por lo tanto, una consulta existente podría producir resultados diferentes, incluso aunque los datos de las tablas no hayan sido modificados, sino sólo aumentados. El uso de nombres de columnas para determinar automáticamente los vínculos de las tablas no es una opción en bases de datos grandes con cientos o miles de tablas, donde impondría una restricción poco realista a las convenciones de nomenclatura. Las bases de datos del mundo real se diseñan comúnmente con datos de clave externa que no se completan de manera consistente (se permiten valores NULL), debido a las reglas comerciales y al contexto. Es una práctica común modificar los nombres de las columnas de datos similares en diferentes tablas y esta falta de coherencia rígida relega las uniones naturales a un concepto teórico de discusión.

La consulta de ejemplo anterior para uniones internas se puede expresar como una unión natural de la siguiente manera:

SELECT *DESDE empleado NATURAL Únete Departamento;

Al igual que con la cláusula USING explícita, solo aparece una columna DepartmentID en la tabla unida, sin ningún calificador:

DepartmentIDEmpleado.Department.DepartmentName
34SmithClerical
33JonesIngeniería
34RobinsonClerical
33HeisenbergIngeniería
31RaffertyVentas

PostgreSQL, MySQL y Oracle admiten uniones naturales; Microsoft T-SQL e IBM DB2 no lo hacen. Las columnas utilizadas en la combinación son implícitas, por lo que el código de combinación no muestra qué columnas se esperan y un cambio en los nombres de las columnas puede cambiar los resultados. En el estándar SQL:2011, las uniones naturales forman parte del paquete opcional F401, "Tabla unida extendida".

En muchos entornos de bases de datos, los nombres de las columnas los controla un proveedor externo, no el desarrollador de la consulta. Una unión natural supone estabilidad y coherencia en los nombres de las columnas, que pueden cambiar durante las actualizaciones de versión exigidas por el proveedor.

Unión externa

La mesa unida conserva cada fila, incluso si no existe otra fila. Las uniones externas subdividen más adelante en las uniones exteriores izquierdas, las uniones externas derechas y las uniones externas completas, dependiendo de las filas de la mesa se conservan: izquierda, derecha o ambas (en este caso izquierda y derecho referencia a los dos lados de los JOIN palabra clave). Como las uniones internas, se puede sub-categorizar más todo tipo de uniones externas como equi-joins, ensamblaciones naturales, ON ( θ-join), etc.

No existe ninguna notación de unión implícita para uniones externas en SQL estándar.

A Venn diagram showing the left circle and overlapping portion filled.
Un diagrama Venn que representa la declaración de SQL izquierda entre las tablas A y B.

Unión exterior izquierda

El resultado de una unión externa izquierda (o simplemente una unión izquierda) para las tablas A y B siempre contiene todas las filas de la tabla "izquierda" tabla (A), incluso si la condición de unión no encuentra ninguna fila coincidente en la sección "derecha" tabla (B). Esto significa que si la cláusula ON coincide con 0 (cero) filas en B (para una fila determinada en A), la unión aún devolverá una fila en el resultado (para esa fila), pero con NULL en cada columna de B. Una unión externa izquierda devuelve todos los valores de una unión interna más todos los valores de la tabla de la izquierda que no coinciden con la tabla de la derecha, incluidas las filas con valores NULL (vacíos) en la columna de enlace.

Por ejemplo, esto nos permite encontrar el departamento de un empleado, pero aún muestra los empleados que no han sido asignados a un departamento (a diferencia del ejemplo de unión interna anterior, donde los empleados no asignados fueron excluidos del resultado). .

Ejemplo de una unión externa izquierda (la palabra clave OUTER es opcional), con la fila de resultado adicional (en comparación con la unión interna) en cursiva:

SELECT *DESDE empleado LEFT Fuera Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;
Empleado.Empleado.DepartmentIDDepartment.DepartmentNameDepartment.DepartmentID
Jones33Ingeniería33
Rafferty31Ventas31
Robinson34Clerical34
Smith34Clerical34
WilliamsNULLNULLNULL
Heisenberg33Ingeniería33

Sintaxis alternativas

Oracle admite la sintaxis obsoleta:

SELECT *DESDE empleado, DepartamentoDonde empleado.DepartmentID = Departamento.DepartmentID()+)

Sybase admite la sintaxis (Microsoft SQL Server desaprobó esta sintaxis desde la versión 2000):

SELECT *DESDE empleado, DepartamentoDonde empleado.DepartmentID *= Departamento.DepartmentID

IBM Informix soporta la sintaxis:

SELECT *DESDE empleado, Fuera DepartamentoDonde empleado.DepartmentID = Departamento.DepartmentID
A Venn diagram show the right circle and overlapping portions filled.
Un diagrama Venn que representa la declaración correcta únase a SQL entre las tablas A y B.

Unión exterior derecha

A derecho exterior (o derecho a unirse) se asemeja estrechamente a una unión externa izquierda, excepto con el tratamiento de las tablas invertidas. Cada fila de la tabla "derecha" (B) aparecerá en la tabla unida al menos una vez. Si no existe una fila de la tabla "izquierda" (A), NULL aparecerá en columnas de A para aquellas filas que no tienen partido en B.

Una combinación externa derecha devuelve todos los valores de la tabla derecha y los valores coincidentes de la tabla izquierda (NULL en el caso de que no haya un predicado de combinación coincidente). Por ejemplo, esto nos permite encontrar cada empleado y su departamento, pero aún así mostrar los departamentos que no tienen empleados.

A continuación se muestra un ejemplo de una unión externa derecha (la palabra clave OUTER es opcional), con la fila de resultados adicional en cursiva:

SELECT *DESDE empleado Bien. Fuera Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;
Empleado.Empleado.DepartmentIDDepartment.DepartmentNameDepartment.DepartmentID
Smith34Clerical34
Jones33Ingeniería33
Robinson34Clerical34
Heisenberg33Ingeniería33
Rafferty31Ventas31
NULLNULLMarketing35

Las uniones exteriores derecha e izquierda son funcionalmente equivalentes. Ninguno proporciona ninguna funcionalidad que el otro no ofrece, por lo que las uniones externas derecha e izquierda pueden reemplazarse entre sí siempre que se cambie el orden de la tabla.

A Venn diagram showing the right circle, left circle, and overlapping portion filled.
Un diagrama Venn que representa la declaración completa de SQL entre tablas A y B.

Unión externa completa

Conceptualmente, una unión exterior completa combina el efecto de aplicar uniones exteriores izquierda y derecha. Cuando las filas de las tablas unidas externas completas no coinciden, el conjunto de resultados tendrá valores NULL para cada columna de la tabla que carezca de una fila coincidente. Para aquellas filas que coincidan, se generará una sola fila en el conjunto de resultados (que contiene columnas completadas de ambas tablas).

Por ejemplo, esto nos permite ver cada empleado que está en un departamento y cada departamento que tiene un empleado, pero también ver cada empleado que no es parte de un departamento y cada departamento que no tiene un empleado. .

Ejemplo de una unión externa completa (la palabra clave OUTER es opcional):

SELECT *DESDE empleado FULL Fuera Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;
Empleado.Empleado.DepartmentIDDepartment.DepartmentNameDepartment.DepartmentID
Smith34Clerical34
Jones33Ingeniería33
Robinson34Clerical34
WilliamsNULLNULLNULL
Heisenberg33Ingeniería33
Rafferty31Ventas31
NULLNULLMarketing35

Algunos sistemas de bases de datos no admiten la funcionalidad completa de combinación externa directamente, pero pueden emularla mediante el uso de una combinación interna y UNION ALL selecciona las "filas de tabla únicas" de las tablas izquierda y derecha respectivamente. El mismo ejemplo puede aparecer de la siguiente manera:

SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentName, Departamento.DepartmentIDDESDE empleadoINNER Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentIDUNION TODOSSELECT empleado.LastName, empleado.DepartmentID, fundición()NULL como varchar()20)), fundición()NULL como entero)DESDE empleadoDonde NO EXISTAS () SELECT * DESDE Departamento Donde empleado.DepartmentID = Departamento.DepartmentID)UNION TODOSSELECT fundición()NULL como varchar()20)), fundición()NULL como entero), Departamento.DepartmentName, Departamento.DepartmentIDDESDE DepartamentoDonde NO EXISTAS () SELECT * DESDE empleado Donde empleado.DepartmentID = Departamento.DepartmentID)

Otro enfoque podría ser UNION TODAS las combinaciones externas izquierda y derecha MENOS la combinación interna.

Autounirse

Una autounión es unir una mesa a sí misma.

Ejemplo

Si hubiera dos tablas separadas para empleados y una consulta que solicitara que los empleados de la primera tabla tuvieran el mismo país que los empleados de la segunda tabla, se podría utilizar una operación de combinación normal para encontrar la tabla de respuestas. Sin embargo, toda la información de los empleados está contenida en una única tabla grande.

Considere una tabla Empleado modificada como la siguiente:

Cuadro de empleados
EmployeeIDLastNamePaísDepartmentID
123RaffertyAustralia31
124JonesAustralia33
145HeisenbergAustralia33
201RobinsonEstados Unidos34
305SmithAlemania34
306WilliamsAlemaniaNULL

Un ejemplo de consulta de solución podría ser el siguiente:

SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.PaísDESDE Employee F INNER Únete Employee S ON F.País = S.PaísDonde F.EmployeeID c) S.EmployeeIDORDER BY F.EmployeeID, S.EmployeeID;

Lo que da como resultado que se genere la siguiente tabla.

Cuadro de empleados después de la unión por país
EmployeeIDLastNameEmployeeIDLastNamePaís
123Rafferty124JonesAustralia
123Rafferty145HeisenbergAustralia
124Jones145HeisenbergAustralia
305Smith306WilliamsAlemania

Para este ejemplo:

  • F y S son alias para la primera y segunda copia de la tabla de empleados.
  • La condición F.Country = S.Country excluye los emparejamientos entre empleados en diferentes países. La pregunta de ejemplo sólo quería pares de empleados en el mismo país.
  • La condición F.EmployeeID < S.EmployeeID excluye los emparejamientos donde el EmployeeID del primer empleado es mayor o igual al EmployeeID del segundo empleado. En otras palabras, el efecto de esta condición es excluir pares duplicados y auto-pairings. Sin ella, se generaría la siguiente tabla menos útil (la tabla siguiente muestra sólo la parte "Alemania" del resultado):
EmployeeIDLastNameEmployeeIDLastNamePaís
305Smith305SmithAlemania
305Smith306WilliamsAlemania
306Williams305SmithAlemania
306Williams306WilliamsAlemania

Solo se necesita uno de los dos pares del medio para satisfacer la pregunta original, y el superior y el inferior no tienen ningún interés en este ejemplo.

Alternativas

El efecto de una unión externa también se puede obtener usando UNION ALL entre una INNER JOIN y un SELECT de las filas en el archivo "principal" tabla que no cumple la condición de unión. Por ejemplo,

SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentNameDESDE empleadoLEFT Fuera Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentID;

también se puede escribir como

SELECT empleado.LastName, empleado.DepartmentID, Departamento.DepartmentNameDESDE empleadoINNER Únete Departamento ON empleado.DepartmentID = Departamento.DepartmentIDUNION TODOSSELECT empleado.LastName, empleado.DepartmentID, fundición()NULL como varchar()20)DESDE empleadoDonde NO EXISTAS () SELECT * DESDE Departamento Donde empleado.DepartmentID = Departamento.DepartmentID)

Aplicación

A query plan for the triangle query R(A, B) ⋈ S(B, C) ⋈ T(A, C) that uses binary joins. It joins S and T first, then joins the result with R.
A query plan for the triangle query R(A, B) ⋈ S(B, C) ⋈ T(A, C) that uses binary joins. It joins R and S first, then joins the result with T.
Dos posibles planes de consulta para triángulo query R(A, B) ⋈ S(B, C); la primera se une S y T primero y se une al resultado con R, el segundo se une R y S primero y se une al resultado con T

Mucho trabajo en los sistemas de bases de datos ha tenido como objetivo la implementación eficiente de las uniones, ya que los sistemas relacionales comúnmente piden unirse, pero enfrentan dificultades para optimizar su ejecución eficiente. El problema surge porque las uniones internas operan de forma comunicativa y asociativa. En la práctica, esto significa que el usuario simplemente suministra la lista de tablas para unirse y las condiciones de unión a utilizar, y el sistema de bases de datos tiene la tarea de determinar la manera más eficiente de realizar la operación. Las opciones se vuelven más complejas a medida que aumenta el número de tablas involucradas en una consulta, cada tabla con características diferentes en el recuento de registros, longitud promedio de registro (considerando campos NULL) e índices disponibles. Donde los filtros de Clause también pueden impactar significativamente el volumen y el costo de las consultas.

Un optimizador de consultas determina cómo ejecutar una consulta que contiene combinaciones. Un optimizador de consultas tiene dos libertades básicas:

  1. Unirse al orden: Debido a que se une a funciones de forma comunicativa y asociativa, el orden en que el sistema se une a tablas no cambia el resultado final conjunto de la consulta. Sin embargo, orden de adhesión podría ser tener un enorme impacto en el costo de la operación de ensamblaje, por lo que elegir el mejor orden de ensamblaje se vuelve muy importante.
  2. Unirse al método: Dados dos tablas y una condición de unión, varios algoritmos pueden producir el conjunto de resultados de la unión. Que algoritmo funciona más eficientemente depende de los tamaños de las tablas de entrada, el número de filas de cada tabla que coinciden con la condición de unión, y las operaciones requeridas por el resto de la consulta.

Muchos algoritmos de unión tratan sus entradas de manera diferente. Se puede hacer referencia a las entradas de una combinación como entradas "externas" y "interno" unir operandos, o "izquierda" y "derecha", respectivamente. En el caso de bucles anidados, por ejemplo, el sistema de base de datos escaneará toda la relación interna en busca de cada fila de la relación externa.

Se pueden clasificar los planes de consulta que involucran uniones de la siguiente manera:

izquierda
utilizando una tabla base (más allá de otra unión) como el funcionamiento interno de cada uno se unen al plan
derecha-deep
utilizando una tabla base como el operario exterior de cada uno de ellos en el plan
bushy
ni izquierda ni derecha; ambas entradas a una unión pueden resultar de las uniones

Estos nombres se derivan de la aparición del plan de consulta si se dibuja como un árbol, con la relación de unión externa a la izquierda y la relación interior a la derecha (como dicta la convención).

Unir algoritmos

Una ilustración de las propiedades de los algoritmos de unión. Al realizar una unión entre más de dos relaciones en más de dos atributos, los algoritmos de unión binaria como hash se unen operan sobre dos relaciones a la vez, y se unen a todos los atributos en la condición de unión; los algoritmos óptimos del peor de los casos, como la unión genérica, operan en un solo atributo a la vez, pero se unen a todas las relaciones en este atributo.

Existen tres algoritmos fundamentales para realizar una operación de unión binaria: unión de bucle anidado, unión de clasificación y fusión y unión hash. Los algoritmos de unión óptima en el peor de los casos son asintóticamente más rápidos que los algoritmos de unión binaria para uniones entre más de dos relaciones en el peor de los casos.

Unir índices

Los índices de unión son índices de bases de datos que facilitan el procesamiento de consultas de unión en almacenes de datos: actualmente (2012) están disponibles en implementaciones de Oracle y Teradata.

En la implementación de Teradata, las columnas especificadas, las funciones agregadas en columnas o los componentes de columnas de fecha de una o más tablas se especifican usando una sintaxis similar a la definición de una vista de base de datos: se pueden especificar hasta 64 columnas/expresiones de columna en un único índice de unión. Opcionalmente, también se puede especificar una columna que defina la clave principal de los datos compuestos: en hardware paralelo, los valores de la columna se utilizan para dividir el contenido del índice en varios discos. Cuando los usuarios actualizan las tablas de origen de forma interactiva, el contenido del índice de combinación se actualiza automáticamente. Cualquier consulta cuya cláusula WHERE especifique cualquier combinación de columnas o expresiones de columnas que sean un subconjunto exacto de las definidas en un índice de combinación (la llamada "consulta de cobertura") generará el índice de combinación, en lugar del original. tablas y sus índices, para ser consultados durante la ejecución de la consulta.

La implementación de Oracle se limita a utilizar índices de mapas de bits. Un índice de unión de mapa de bits se utiliza para columnas de baja cardinalidad (es decir, columnas que contienen menos de 300 valores distintos, según la documentación de Oracle): combina columnas de baja cardinalidad de múltiples tablas relacionadas. El ejemplo que utiliza Oracle es el de un sistema de inventario, donde diferentes proveedores proporcionan diferentes piezas. El esquema tiene tres tablas vinculadas: dos "tablas maestras", Pieza y Proveedor, y una "tabla de detalles", Inventario. La última es una tabla de muchos a muchos que vincula al proveedor con la pieza y contiene la mayor cantidad de filas. Cada pieza tiene un Tipo de pieza, cada proveedor tiene su sede en EE. UU. y tiene una columna de Estado. No hay más de 60 estados y territorios en los EE. UU. y no más de 300 tipos de piezas. El índice de unión de mapa de bits se define utilizando una unión estándar de tres tablas en las tres tablas anteriores y especificando las columnas Part_Type y Supplier_State para el índice. Sin embargo, está definido en la tabla Inventario, aunque las columnas Tipo_pieza y Estado_proveedor sean "prestadas" del Proveedor y Pieza respectivamente.

En cuanto a Teradata, un índice de unión de mapa de bits de Oracle solo se utiliza para responder una consulta cuando la cláusula WHERE de la consulta especifica columnas limitadas a aquellas que están incluidas en el índice de unión.

Unión directa

Algunos sistemas de bases de datos permiten al usuario forzar al sistema a leer las tablas en una combinación en un orden particular. Esto se utiliza cuando el optimizador de combinaciones elige leer las tablas en un orden ineficiente. Por ejemplo, en MySQL el comando STRAIGHT_JOIN lee las tablas exactamente en el orden que figura en la consulta.

Contenido relacionado

Spl (Unix)

spl es el nombre de una colección de rutinas o macros del kernel de Unix utilizadas. para cambiar el nivel de prioridad de interrupción. Históricamente...

Encuadernación tardía

En informática, el enlace tardío o enlace dinámico es un mecanismo de programación informática en el que el método que se invoca en un objeto, o la...

Tabla de métodos virtuales

En programación informática, una tabla de métodos virtuales una tabla de funciones virtuales, una tabla de llamadas virtuales , tabla de despacho, vtable o...

ALGOL Y

ALGOL Y fue el nombre dado a un sucesor especulado del lenguaje de programación ALGOL 60 que incorporaba algunas características radicales que fueron...

Alma-0

Alma-0 es un lenguaje de programación informática multiparadigma. Este lenguaje es una versión aumentada del lenguaje imperativo Modula-2 con...
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save