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?

Wern Ancheta
fonte

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 .

Pôneis OMG
fonte
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
Taryn
fonte
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

halfdan
fonte
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

vog
fonte
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

Bryan Legend
fonte
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;
MJ
fonte
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;
Festole
fonte
-1
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
Nikunj
fonte