1052: A coluna 'id' na lista de campos é ambígua


94

Eu tenho 2 mesas. tbl_namese tbl_sectionque tem ambos o idcampo neles. Como faço para selecionar o idcampo, porque sempre recebo este erro:

1052: Column 'id' in field list is ambiguous

Esta é a minha consulta:

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

Eu poderia apenas selecionar todos os campos e evitar o erro. Mas isso seria um desperdício de desempenho. O que devo fazer?

Respostas:


152

O SQL oferece suporte à qualificação de uma coluna prefixando a referência com o nome completo da tabela:

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

... ou um alias de tabela:

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

O alias da tabela é a abordagem recomendada - por que digitar mais do que o necessário?

Por que essas consultas parecem diferentes?

Em segundo lugar, minhas respostas usam a sintaxe ANSI-92 JOIN (a sua é ANSI-89). Embora tenham o mesmo desempenho, a sintaxe ANSI-89 não suporta junções OUTER (RIGHT, LEFT, FULL). A sintaxe ANSI-89 deve ser considerada obsoleta, há muitos no SO que não votarão na sintaxe ANSI-89 para reforçar isso. Para mais informações, veja esta pergunta .


Confuso! Como nada é realmente removido da linguagem SQL, o SQL-89 é um subconjunto adequado do SQL-92. A sintaxe do OP é uma sintaxe válida do SQL-92 (e, a menos que esteja faltando alguma coisa, a sua é uma sintaxe válida do SQL-89). Eu considero INNER JOINestar 'depreciado' desde a introdução do SQL-92 NATURAL JOIN.
quando

16

Em sua SELECTdeclaração, você precisa prefaciar seu id com a tabela da qual deseja escolhê-lo.

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

OU

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

Isso retorna apenas um dos idcampos; o OP declara "basta selecionar todos os campos e evitar o erro". E, eu não voto na sintaxe ANSI-89.
Pôneis OMG

Concordo, mas a questão era como selecionar o campo id.
Taryn

6

Você faria isso fornecendo um nome totalmente qualificado, por exemplo:

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

O que lhe daria o id de tbl_names


Veja meu comentário sobre a resposta do bluefeet
OMG Ponies

Não é um 'nome totalmente qualificado', é uma variável de intervalo. Quando você omite uma variável de intervalo explícita, o SQL gera uma que é igual ao nome da tabela. Para ver melhor o que quero dizer, altere sua FROMcláusula ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- é isso que o analisador está fazendo para gerar uma variável de intervalo.
quando

4

A solução mais simples é juntar com em USINGvez de ON. Dessa forma, o banco de dados "sabe" que as duas idcolunas são realmente as mesmas e não fará nenhuma crítica a isso:

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

Se idfor o único nome de coluna comum em tbl_namese tbl_section, você pode até usar NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

Veja também: https://dev.mysql.com/doc/refman/5.7/en/join.html


3

O que provavelmente você realmente deseja fazer aqui é usar o operador sindical assim:

(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

Aqui estão os documentos para ele https://dev.mysql.com/doc/refman/5.0/en/union.html


3

Já existem muitas respostas para sua pergunta. Você também pode fazer assim. Você pode dar à sua tabela um nome de alias e usá-lo na consulta de seleção como este:

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

0

Se o formato dos id's nas duas tabelas variar, então você deseja juntá-los, como tal, você pode selecionar para usar um id de uma tabela principal, digamos, se você tem table_customese table_orders, e esse id para pedidos é como " 101 ", " 102 " ... " 110 ", basta usar um para 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.