Una cláusula de unión 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
, y .RIGHT OUTER
FULL OUTER
CROSS
Para explicar los tipos de unión, el resto de este artículo utiliza las siguientes tablas:
Department.DepartmentID
es la clave principal de la Department
tabla, mientras que Employee.DepartmentID
es una clave externa .
Tenga en cuenta que en Employee
, "Williams" aún no ha sido asignado a un departamento. Además, no se ha asignado ningún empleado al departamento de "Marketing".
Estas son las declaraciones SQL para crear las tablas anteriores:
CREAR TABLA departamento ( DepartmentID INT CLAVE PRIMARIA NO NULA , NombreDepartamento VARCHAR ( 20 ) );CREAR TABLA empleado ( Apellido VARCHAR ( 20 ), DepartmentID INT REFERENCIAS departamento ( DepartmentID ) );INSERTAR EN el departamento VALORES ( 31 , 'Ventas' ), ( 33 , 'Ingeniería' ), ( 34 , 'clerical' ), ( 35 , 'Márketing' ); INSERTAR EN empleado VALORES ( 'Rafferty' , 31 ), ( 'Jones' , 33 ), ( 'Heisenberg' , 33 ), ( 'Robinson' , 34 ), ( 'Smith' , 34 ), ( 'Williams' , NULO );
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. [1]
Ejemplo de unión cruzada explícita:
SELECCIONAR * DEL departamento CROSS JOIN del empleado ;
Ejemplo de unión cruzada implícita:
SELECCIONAR * DE empleado , departamento ;
La unión cruzada se puede reemplazar con una unión interna con una condición siempre verdadera:
SELECCIONAR * DEL empleado INNER JOIN departamento ON 1 = 1 ;
CROSS JOIN
no aplica ningún predicado para filtrar filas de la tabla unida. Los resultados de a CROSS JOIN
se pueden filtrar usando una WHERE
cláusula, que luego puede producir el equivalente a una combinació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. [ ¿ por qué? ]
Una combinación interna (o combinación ) requiere que cada fila de las dos tablas unidas tenga valores de columna coincidentes y es una operación de combinación comúnmente utilizada en aplicaciones , pero no se debe asumir que sea 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 unir predicado. 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 [ ¿por quién? ] , aunque los sistemas de bases de datos todavía lo admiten.
La "notación de unión explícita" utiliza la JOIN
palabra clave, opcionalmente precedida por la INNER
palabra clave, para especificar la tabla a unir, y la ON
palabra clave para especificar los predicados de la unión, como en el siguiente ejemplo:
SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento FROM empleado INNER JOIN departamento ON empleado . IDDepartamento = departamento . ID de departamento ;
La "notación de unión implícita" simplemente enumera las tablas para unir, en la FROM
cláusula de la SELECT
declaración, usando comas para separarlas. Por lo tanto, especifica una unión cruzada y la WHERE
cláusula 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:
SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento FROM empleado , departamento DONDE empleado . IDDepartamento = departamento . ID de departamento ;
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á:
El empleado "Williams" y el departamento "Marketing" no aparecen en los resultados de la 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.
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 unen NOT NULL
antes de aplicar. las condiciones predicadas 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. [2] [3] [4] 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 identificador numérico (una tabla de búsqueda ), un valor NULL en cualquiera de las claves externas puede provocar que se elimine toda la fila. 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 uniones internas supone que las columnas de unión NULL no serán introducidas por 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.
Además, se pueden clasificar las uniones internas como uniones equiuniones, uniones naturales o uniones cruzadas.
Una combinación equi es un tipo específico de combinación basada en comparador, que utiliza solo comparaciones de igualdad en el predicado de combinació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:
SELECCIONAR * DEL empleado UNIRSE al departamento DEL empleado . IDDepartamento = departamento . ID de departamento ;
Podemos escribir equi-join como se muestra a continuación,
SELECCIONE * DEL empleado , departamento DONDE empleado . IDDepartamento = departamento . ID de departamento ;
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 USING
construcción: [5]
SELECCIONAR * DEL empleado INNER JOIN departamento USANDO ( DepartamentoID );
Sin embargo, la USING
construcción 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 USING
lista 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 sola DepartmentID
columna y no employee.DepartmentID
habrá ni department.DepartmentID
.
La USING
cláusula no es compatible con MS SQL Server y Sybase.
La unión natural es un caso especial de unión equi. La unión natural (⋈) es un operador binario que se escribe como ( R ⋈ S ) donde R y S son relaciones . [6] 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 Departamento y su combinación natural:
Esto también se puede utilizar para definir la composición de las relaciones . Por ejemplo, la composición de Empleado y Departamento es su combinación como se muestra arriba, proyectada en todos menos en el atributo común NombreDepto . 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 probablemente exista una clave externa de Empleado . NombreDepto al Departamento . DeptName y luego la unión natural de Empleado y Departamento 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 del Departamento . gerente a empleado . Nombre , entonces estas columnas deben cambiarse de nombre antes de que se tome la unión natural. A veces, esta unión también se denomina unión equi .
Más formalmente, la semántica de la unión natural se define de la siguiente manera:
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 y 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 c 1 , ..., cm los nombres de atributos comunes a R y S , r 1 , ..., r n los nombres de atributos únicos de R y sean s 1 , ..., s k los atributos exclusivo de S. Además, supongamos que los nombres de los atributos x 1 , ..., x m no están ni en R ni en S . En un primer paso, ahora se pueden cambiar los nombres de los atributos comunes en S :
Luego tomamos el producto cartesiano y seleccionamos las tuplas que se van a unir:
Una unión natural es un tipo de unión equivalente en la que el predicado de unión surge implícitamente al comparar todas las columnas de ambas tablas que tienen los mismos nombres de columna en las tablas unidas. La tabla unida resultante contiene solo una columna para cada par de columnas con el mismo nombre. 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 tanto, desaconsejan su uso. [7] El peligro proviene de agregar inadvertidamente una nueva columna, con el mismo nombre que otra columna en la otra tabla. Una unión natural existente podría entonces usar "naturalmente" 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:
SELECCIONAR * DEL departamento NATURAL JOIN del empleado ;
Al igual que con la USING
cláusula explícita, solo aparece una columna DepartmentID en la tabla unida, sin ningún calificador:
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 son 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.
La tabla unida conserva cada fila, incluso si no existe otra fila coincidente. Las uniones externas se subdividen en uniones externas izquierdas, uniones externas derechas y uniones externas completas, según las filas de la tabla que se conserven: izquierda, derecha o ambas (en este caso, izquierda y derecha se refieren a los dos lados de la JOIN
palabra clave). Al igual que las uniones internas, se pueden subcategorizar aún más todos los tipos de uniones externas como uniones equi, uniones naturales ( θ -join ), etc. [8]ON <predicate>
No existe ninguna notación de unión implícita para uniones externas en SQL estándar.
El resultado de una unión externa izquierda (o simplemente unión izquierda ) para las tablas A y B siempre contiene todas las filas de la tabla "izquierda" (A), incluso si la condición de unión no encuentra ninguna fila coincidente en la tabla "derecha" (B). Esto significa que si la ON
cláusula coincide con 0 (cero) filas en B (para una fila determinada en A), la combinación aún devolverá una fila en el resultado (para esa fila), pero con NULL en cada columna de B. A izquierda la combinación externa devuelve todos los valores de una combinació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 combinación externa izquierda (la OUTER
palabra clave es opcional), con la fila de resultado adicional (en comparación con la combinación interna) en cursiva:
SELECCIONAR * DEL empleado IZQUIERDO EXTERIOR UNIRSE al departamento DEL empleado . IDDepartamento = departamento . ID de departamento ;
Oracle admite la sintaxis obsoleta [9] :
SELECCIONE * DEL empleado , departamento DONDE empleado . IDDepartamento = departamento . ID de departamento ( + )
Sybase admite la sintaxis ( Microsoft SQL Server desaprobó esta sintaxis desde la versión 2000):
SELECCIONE * DEL empleado , departamento DONDE empleado . IDDepartamento *= departamento . ID de departamento
IBM Informix soporta la sintaxis:
SELECCIONE * DEL empleado , departamento EXTERNO DONDE empleado . IDDepartamento = departamento . ID de departamento
Una combinación exterior derecha (o combinación derecha ) se parece mucho a una combinación exterior izquierda, excepto que el tratamiento de las tablas se invierte. Cada fila de la tabla "derecha" (B) aparecerá en la tabla unida al menos una vez. Si no existe ninguna fila coincidente de la tabla "izquierda" (A), aparecerá NULL en las columnas de A para aquellas filas que no coincidan 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 combinación externa derecha (la OUTER
palabra clave es opcional), con la fila de resultados adicional en cursiva:
SELECCIONAR * DEL empleado DERECHO EXTERNO UNIRSE al departamento DEL empleado . IDDepartamento = departamento . ID de departamento ;
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.
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 unión externa completa (la OUTER
palabra clave es opcional):
SELECCIONAR * DEL empleado COMPLETO EXTERIOR UNIRSE al departamento DEL empleado . IDDepartamento = departamento . ID de departamento ;
Algunos sistemas de bases de datos no admiten directamente la funcionalidad de combinación externa completa, 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:
SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento , departamento . ID de departamento DEL empleado INNER JOIN departamento ON empleado . IDDepartamento = departamento . ID de departamento UNIÓN TODOS SELECCIONAR empleado . Apellido , empleado . IDDepartamento , emitir ( NULL como varchar ( 20 ) ) , emitir ( NULL como entero ) DESDE empleado DONDE NO EXISTE ( SELECCIONAR * DESDE departamento DONDE empleado . IDDepartamento = departamento.IDDepartamento ) UNIÓN TODOS SELECCIONE conversión ( NULL como varchar ( 20 )), conversión ( NULL como entero ), departamento . NombreDepartamento , departamento . IDDepartamento DEL departamento DONDE NO EXISTE ( SELECCIONAR * DEL empleado DONDE empleado.IDDepartamento = departamento.IDDepartamento ) _ _ _ _
Otro enfoque podría ser UNION ALL de la unión exterior izquierda y la unión exterior derecha MENOS la unión interior.
Una autounión es unir una mesa a sí misma. [10]
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 unión normal para encontrar la tabla de respuestas. Sin embargo, toda la información de los empleados está contenida en una única tabla grande. [11]
Considere una tabla modificada Employee
como la siguiente:
Una consulta de solución de ejemplo podría ser la siguiente:
SELECCIONE F. _ ID de empleado , F. Apellidos . _ _ ID de empleado , S. Apellido , F. _ País DESDE Empleado F INNER JOIN Empleado S ON F . País = S . País DONDE F . ID de empleado < S . ID de empleado ORDEN POR F . ID de empleado , S. ID de empleado ;
Lo que da como resultado que se genere la siguiente tabla.
Para este ejemplo:
F
y S
son alias para la primera y segunda copia de la tabla de empleados.F.Country = S.Country
excluye los emparejamientos entre empleados de diferentes países. La pregunta de ejemplo sólo quería pares de empleados en el mismo país.F.EmployeeID < S.EmployeeID
excluye los emparejamientos en los que 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 los emparejamientos duplicados y los autoemparejamientos. Sin él, se generaría la siguiente tabla menos útil (la siguiente tabla muestra sólo la parte "Alemania" del resultado):Sólo 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.
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 de la tabla "principal" que no cumplen la condición de unión. Por ejemplo,
SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento DEL empleado IZQUIERDO EXTERIOR ÚNETE al departamento EN empleado . IDDepartamento = departamento . ID de departamento ;
también se puede escribir como
SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento FROM empleado INNER JOIN departamento ON empleado . IDDepartamento = departamento . ID de departamento UNIÓN TODOS SELECCIONAR empleado . Apellido , empleado . IDDepartamento , emitido ( NULL como varchar ( 20 )) DEL empleado DONDE NO EXISTE ( SELECCIONE * DEL departamento DONDE empleado . IDDepartamento = departamento . IDDepartamento )
Gran parte del trabajo en sistemas de bases de datos se ha dirigido a la implementación eficiente de uniones, porque los sistemas relacionales comúnmente requieren uniones, pero enfrentan dificultades para optimizar su ejecución eficiente. El problema surge porque las uniones internas operan tanto de forma conmutativa como asociativa . En la práctica, esto significa que el usuario simplemente proporciona la lista de tablas para unirse y las condiciones de unión a usar, y el sistema de base de datos tiene la tarea de determinar la forma más eficiente de realizar la operación. Un optimizador de consultas determina cómo ejecutar una consulta que contiene combinaciones. Un optimizador de consultas tiene dos libertades básicas:
Muchos algoritmos de unión tratan sus entradas de manera diferente. Se puede hacer referencia a las entradas de una combinación como operandos de combinación "exterior" e "interior", 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: [12]
Estos nombres se derivan de la apariencia 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 interna a la derecha (como dicta la convención).
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 .
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 [14] y Teradata . [15]
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 una sola unirse al índice. 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 particionar 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") hará que el índice de combinación, en lugar de las tablas originales y sus índices, para ser consultado durante la ejecución de la consulta.
La implementación de Oracle se limita a utilizar índices de mapas de bits . Se utiliza un índice de unión de mapa de bits 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, se define en la tabla Inventario, aunque las columnas Tipo_Parte y Estado_Proveedor están "prestadas" del Proveedor y Parte 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.
Algunos sistemas de bases de datos permiten al usuario forzar al sistema a leer las tablas de 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. [dieciséis]