El síntoma: cada SELECT tiene una forma distinta
En una operación UNION, UNION ALL, INTERSECT o EXCEPT, las consultas participantes deben producir una estructura compatible. PostgreSQL define la compatibilidad de unión exigiendo el mismo número de columnas y tipos compatibles; SQLite exige el mismo número de columnas en cada SELECT de una consulta compuesta.
Por eso el primer diagnóstico no consiste en cambiar UNION por UNION ALL. Ambos necesitan que las filas tengan la misma cantidad de posiciones.
Ejemplo reproducible: dos columnas frente a tres
SELECT id, nombre
FROM clientes
UNION ALL
SELECT id, nombre, ciudad
FROM proveedores;La primera consulta devuelve dos columnas y la segunda tres. No existe una tercera posición en las filas de clientes con la que combinar ciudad.
Alinea primero el significado de las columnas
No añadas una columna cualquiera solo para satisfacer el contador. Decide qué representa cada posición del resultado final. Si quieres una lista común de entidades con su origen, ambas ramas pueden devolver id, nombre y una etiqueta de origen:
SELECT id, nombre, 'cliente' AS origen
FROM clientes
UNION ALL
SELECT id, nombre, 'proveedor' AS origen
FROM proveedores;| id | nombre | origen |
|---|---|---|
| 1 | Ana | cliente |
| 8 | Delta SA | proveedor |
Después del número, revisa los tipos por posición
Tener tres columnas a cada lado no garantiza por sí solo una unión bien diseñada. La primera columna se combina con la primera, la segunda con la segunda y así sucesivamente. PostgreSQL exige tipos compatibles; MySQL determina el tipo resultante considerando los valores de las columnas correspondientes. Evita mezclar, por ejemplo, una fecha con un identificador solo porque ocupan la misma posición.
Los nombres visibles del resultado tampoco se emparejan por nombre. En motores como PostgreSQL y MySQL, los nombres de salida se determinan a partir de la primera rama; lo importante para la combinación es la posición y la compatibilidad.
Método de diagnóstico
- Ejecuta cada SELECT por separado y cuenta sus columnas.
- Escribe el significado de cada posición: id, nombre, fecha, origen, etc.
- Alinea la cantidad sin introducir datos artificiales que cambien la intención.
- Comprueba tipos compatibles en cada posición.
- Elige UNION o UNION ALL después, según necesites eliminar o conservar duplicados.
Error frecuente: usar SELECT * en ambas ramas
El asterisco oculta la estructura real
Si dos tablas evolucionan de forma distinta, SELECT * puede cambiar el número u orden de columnas sin que la intención del UNION sea evidente. En operaciones de conjuntos suele ser más seguro enumerar las columnas explícitamente.
Práctica correctiva
Une dos listas con la misma forma
clientes tiene id y nombre. empleados tiene id, nombre y departamento. Devuelve una lista de id, nombre y tipo, usando 'cliente' o 'empleado'.
tipo para documentar esa posición.Solución razonada
SELECT id, nombre, 'cliente' AS tipo
FROM clientes
UNION ALL
SELECT id, nombre, 'empleado' AS tipo
FROM empleados;Las dos ramas devuelven tres columnas con el mismo significado por posición. UNION ALL conserva todas las filas; cambia a UNION solo si realmente quieres eliminar duplicados completos.
Qué debes recordar
- Las ramas de una operación de conjuntos necesitan el mismo número de columnas.
- Las posiciones deben representar conceptos compatibles.
UNION ALLno corrige un desajuste estructural.- Enumerar columnas explícitamente hace el contrato de la unión más claro.
Conceptos relacionados
Fuentes técnicas
La sintaxis y las diferencias de motor de esta guía se contrastaron con documentación primaria: