1052: La columna 'id' en la lista de campos es ambigua


94

Tengo 2 mesas. tbl_namesy tbl_sectionque tiene tanto el idcampo en ellos. ¿Cómo hago para seleccionar el idcampo, porque siempre obtengo este error:

1052: Column 'id' in field list is ambiguous

Aquí está mi consulta:

SELECT id, name, section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id

Podría seleccionar todos los campos y evitar el error. Pero eso sería un desperdicio de rendimiento. ¿Qué tengo que hacer?

Respuestas:


152

SQL admite la calificación de una columna anteponiendo la referencia con el nombre completo de la tabla:

SELECT tbl_names.id, tbl_section.id, name, section
  FROM tbl_names
  JOIN tbl_section ON tbl_section.id = tbl_names.id 

... o un alias de tabla:

SELECT n.id, s.id, n.name, s.section
  FROM tbl_names n
  JOIN tbl_section s ON s.id = n.id 

El alias de la tabla es el enfoque recomendado, ¿por qué escribir más de lo necesario?

¿Por qué estas consultas tienen un aspecto diferente?

En segundo lugar, mis respuestas usan la sintaxis ANSI-92 JOIN (la suya es ANSI-89). Si bien realizan lo mismo, la sintaxis ANSI-89 no admite combinaciones EXTERIORES (DERECHA, IZQUIERDA, COMPLETA). La sintaxis ANSI-89 debe considerarse obsoleta, hay muchos en SO que no votarán por la sintaxis ANSI-89 para reforzar eso. Para obtener más información, consulte esta pregunta .


¡Confuso! Dado que en realidad no se elimina nada del lenguaje SQL, SQL-89 es un subconjunto adecuado de SQL-92. La sintaxis del OP es una sintaxis SQL-92 válida (y. A menos que me falte algo, la suya es la sintaxis SQL-89 válida). Considero INNER JOINque está 'depreciado' desde que se introdujo SQL-92 NATURAL JOIN.
cuando

16

En su SELECTdeclaración, debe anteponer su identificación con la tabla de la que desea elegirla.

SELECT tbl_names.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id

O

SELECT tbl_section.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id

Esto solo devuelve uno de los idcampos; el OP dice "simplemente seleccione todos los campos y evite el error". Y no voto por la sintaxis ANSI-89.
OMG Ponies

De acuerdo, pero la pregunta era cómo seleccionar el campo de identificación.
Taryn

6

Lo haría proporcionando un nombre completo, por ejemplo:

SELECT tbl_names.id as id, name, section FROM tbl_names, tbl_section WHERE tbl_names.id = tbl_section.id

Lo que le daría la identificación de tbl_names


Vea mi comentario a la respuesta de bluefeet
OMG Ponies

No es un 'nombre completo', es una variable de rango. Cuando omite una variable de rango explícita, SQL genera una que es igual al nombre de la tabla. Para ver mejor lo que quiero decir, cambie su FROMcláusula ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...; eso es lo que está haciendo el analizador para generar una variable de rango.
cuando

4

La solución más simple es unir con en USINGlugar de ON. De esa manera, la base de datos "sabe" que ambas idcolumnas son realmente iguales y no se preocupará por eso:

SELECT id, name, section
  FROM tbl_names
  JOIN tbl_section USING (id)

Si ides el único nombre de columna común en tbl_namesy tbl_section, incluso puede usar un NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

Ver también: https://dev.mysql.com/doc/refman/5.7/en/join.html


3

Lo que probablemente quiera hacer aquí es usar el operador de unión de esta manera:

(select ID from Logo where AccountID = 1 and Rendered = 'True')
  union
  (select ID from Design where AccountID = 1 and Rendered = 'True')
  order by ID limit 0, 51

Aquí están los documentos https://dev.mysql.com/doc/refman/5.0/en/union.html


3

Ya hay muchas respuestas a tu pregunta, también puedes hacerlo así. Puede darle a su tabla un nombre de alias y usarlo en la consulta de selección como esta:

SELECT a.id, b.id, name, section
FROM tbl_names as a 
LEFT JOIN tbl_section as b ON a.id = b.id;

0

Si el formato de las identificaciones en las dos tablas varía, entonces desea unirlas, como tal, puede seleccionar usar una identificación de una tabla principal, digamos si tiene table_customesy table_orders, y la identificación para los pedidos es como " 101 ", " 102 " ... " 110 ", solo use uno para los clientes

select customers.id, name, amount, date from customers.orders;

-1
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.