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: tipos que SQL Server puede convertir a un tipo común. Los nombres finales se toman de la primera consulta.
UNION ALL: conservar todas las filas
UNION ALL reúne los resultados sin buscar duplicados. Si una misma fila aparece en ambos conjuntos, permanece dos veces.
SELECT Columna1, Columna2
FROM dbo.TablaActual
UNION ALL
SELECT ColumnaCompatible1, ColumnaCompatible2
FROM dbo.TablaHistorica;
UNION: eliminar duplicados del conjunto combinado
UNION aplica las mismas reglas de forma, pero conserva una sola copia de cada fila completa repetida.
SELECT Columna1, Columna2
FROM dbo.TablaActual
UNION
SELECT ColumnaCompatible1, ColumnaCompatible2
FROM dbo.TablaHistorica;
Ejemplo: pedidos actuales e históricos
CAST(expresión AS tipo) convierte un valor al tipo indicado. Aquí fija ambas etiquetas como NVARCHAR(10) para que la columna Origen tenga una longitud conocida en los dos lados de la combinación.
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, que asigna una posición a cada fila según un orden, 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: conversiones indicadas en la consulta, no decididas automáticamente por SQL Server, 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.