UNION y UNION ALL: combinar resultados compatibles
Algunas veces la información vive en tablas distintas pero representa el mismo tipo de entidad. Podemos tener pedidos actuales y pedidos históricos, o resultados provenientes de dos filtros diferentes.
UNION y UNION ALL colocan un conjunto debajo del otro. No relacionan columnas como un JOIN; agregan filas a un resultado común.
La idea
Cada consulta debe producir el mismo número de columnas en el mismo orden, con tipos compatibles. Los nombres finales se toman de la primera consulta.
UNION ALLconserva todas las filas, incluidas las repetidas.UNIONelimina duplicados del resultado combinado.
Sintaxis
SELECT Columna1, Columna2
FROM dbo.TablaActual
UNION ALL
SELECT ColumnaCompatible1, ColumnaCompatible2
FROM dbo.TablaHistorica;
Ejemplo: pedidos actuales e históricos
SELECT
p.IdPedido,
p.IdCliente,
p.FechaPedido,
p.Estado,
CAST(N'Actual' AS NVARCHAR(10)) AS Origen
FROM dbo.Pedido AS p
UNION ALL
SELECT
ph.IdPedidoOriginal,
ph.IdCliente,
ph.FechaPedido,
ph.Estado,
CAST(N'Histórico' AS NVARCHAR(10)) AS Origen
FROM dbo.PedidoHistorico AS ph
ORDER BY FechaPedido DESC;
La columna Origen permite distinguir conjuntos que de otra manera tendrían la misma forma. El ORDER BY se escribe una sola vez, al final de la combinación.
¿Cuándo utilizar UNION?
Si dos consultas pueden producir exactamente la misma fila y nuestra intención es conservarla una sola vez:
SELECT IdCliente
FROM dbo.Pedido
WHERE Estado = 'Confirmado'
UNION
SELECT IdCliente
FROM dbo.Pedido
WHERE Estado = 'Enviado';
El resultado contiene cada identificador una sola vez. Sin embargo, si sabemos que los conjuntos no se superponen o si las repeticiones tienen significado, UNION ALL evita el trabajo adicional de detectar duplicados.
Los duplicados se comparan por la fila completa
UNION no deduplica utilizando únicamente la llave que consideramos importante. Compara todas las columnas seleccionadas. Dos filas con el mismo IdCliente y fechas diferentes siguen siendo distintas.
Si necesitamos elegir una fila específica por entidad, probablemente requerimos ROW_NUMBER, una agregación u otra regla explícita.
Qué conviene comprobar
El orden de las columnas puede producir errores silenciosos de interpretación cuando dos posiciones aceptan tipos compatibles pero representan datos diferentes. Por eso conviene escribir las listas con el mismo formato y utilizar conversiones explícitas cuando la longitud o precisión debe quedar controlada.
También revisamos si la eliminación de duplicados es realmente parte de la necesidad. Utilizar UNION por costumbre puede ocultar una duplicación originada en otra parte de la consulta.
Relacionado con
JOIN: combina columnas de filas relacionadas, no resultados verticales.INTERSECTyEXCEPT: conservan coincidencias o diferencias entre conjuntos.- Conversiones: alinean tipos y longitudes entre consultas.
- Funciones de ventana: permiten elegir una fila por entidad después de combinar.