El síntoma: el nombre de una columna existe en más de una tabla
Al unir tablas es habitual que ambas tengan columnas llamadas id, nombre, fecha o estado. Si escribes solo el nombre y el motor no puede determinar a qué origen te refieres, la referencia es ambigua.
PostgreSQL identifica esta condición como ambiguous_column (SQLSTATE 42702). SQL Server también recomienda calificar una columna cuando varias tablas del FROM comparten el mismo nombre.
Ejemplo reproducible: id pertenece a dos relaciones
WITH clientes(id, nombre) AS (
VALUES (1, 'Ana'), (2, 'Luis')
), pedidos(id, cliente_id) AS (
VALUES (101, 1), (102, 2)
)
SELECT id, nombre
FROM clientes
JOIN pedidos
ON clientes.id = pedidos.cliente_id;Tanto clientes como pedidos tienen una columna id. El motor necesita saber cuál quieres proyectar.
Califica la columna y usa alias consistentes
WITH clientes(id, nombre) AS (
VALUES (1, 'Ana'), (2, 'Luis')
), pedidos(id, cliente_id) AS (
VALUES (101, 1), (102, 2)
)
SELECT c.id AS cliente_id,
c.nombre,
p.id AS pedido_id
FROM clientes AS c
JOIN pedidos AS p
ON c.id = p.cliente_id
ORDER BY c.id;| cliente_id | nombre | pedido_id |
|---|---|---|
| 1 | Ana | 101 |
| 2 | Luis | 102 |
Método de diagnóstico
- Busca el nombre señalado en todas las tablas y subconsultas visibles en ese nivel.
- Decide el origen correcto según la intención, no según el alias más corto.
- Califica la referencia con
alias.columna. - Si el SELECT devuelve dos columnas parecidas, renómbralas con alias de salida que expliquen su significado.
No mezcles el nombre real de la tabla con su alias
Cuando asignas un alias, úsalo de forma consistente en esa consulta. Además de evitar ambigüedad, los prefijos cortos hacen visible la procedencia de cada columna en JOINs de varias tablas.
Buena señal: otra persona puede leer p.id y c.id y saber inmediatamente que son identificadores de entidades distintas.
Error frecuente: calificar todas las columnas sin pensar en su significado
Resolver el parser no basta
Es posible eliminar el mensaje escogiendo una de las dos columnas y aun así elegir la columna equivocada. Antes de añadir el prefijo, pregunta qué entidad debe representar el valor en esa posición.
Práctica correctiva
Distingue el identificador del cliente y el del pedido
Modifica un SELECT que contiene id para devolver ambos identificadores con nombres de salida distintos.
c.id y p.id.Solución razonada
WITH clientes(id, nombre) AS (
VALUES (1, 'Ana'), (2, 'Luis')
), pedidos(id, cliente_id) AS (
VALUES (101, 1), (102, 2)
)
SELECT c.id AS cliente_id,
p.id AS pedido_id
FROM clientes AS c
JOIN pedidos AS p
ON c.id = p.cliente_id
ORDER BY c.id;Los prefijos resuelven el origen y los alias de salida evitan que el resultado vuelva a presentar dos columnas indistinguibles llamadas id.
Qué debes recordar
- Una columna es ambigua cuando más de un origen visible puede resolver el mismo nombre.
- Usa
alias.columnapara hacer explícita la procedencia. - Los alias de salida deben distinguir entidades diferentes aunque sus columnas originales compartan nombre.
- Resolver la ambigüedad sintáctica no sustituye comprobar que elegiste la columna correcta.