Error SQL · operaciones de conjuntos

UNION falla porque las consultas no devuelven el mismo número de columnas

UNION no une tablas por nombre de columna: combina filas por posición. Si una consulta devuelve dos columnas y la otra tres, la operación no tiene una estructura común que pueda formar un único resultado.

Lectura: 14–18 minEjemplo reproduciblePráctica con pistas

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

Consulta problemática
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:

Consulta corregida
SELECT id, nombre, 'cliente' AS origen
FROM clientes
UNION ALL
SELECT id, nombre, 'proveedor' AS origen
FROM proveedores;
Forma común del resultado
idnombreorigen
1Anacliente
8Delta SAproveedor

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

  1. Ejecuta cada SELECT por separado y cuenta sus columnas.
  2. Escribe el significado de cada posición: id, nombre, fecha, origen, etc.
  3. Alinea la cantidad sin introducir datos artificiales que cambien la intención.
  4. Comprueba tipos compatibles en cada posición.
  5. 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

Básica · conjuntos

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'.

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 ALL no 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: