web-dev-qa-db-fra.com

1052: La colonne 'id' dans la liste de champs est ambiguë

J'ai 2 tables. tbl_names et tbl_section qui contient le champ id. Comment faire pour sélectionner le champ id, car j'obtiens toujours l'erreur suivante:

1052: Column 'id' in field list is ambiguous

Voici ma requête:

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

Je pourrais simplement sélectionner tous les champs et éviter l'erreur. Mais ce serait une perte de performance. Que devrais-je faire?

79
Wern Ancheta

SQL prend en charge la qualification d'une colonne en préfixant la référence avec le nom complet de la table:

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

... ou un alias de table:

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

L’alias de table est l’approche recommandée - pourquoi taper plus que nécessaire?

Pourquoi ces requêtes ont-elles un aspect différent?

Deuxièmement, mes réponses utilisent la syntaxe ANSI-92 JOIN (la vôtre est ANSI-89). Même s'ils fonctionnent de la même manière, la syntaxe ANSI-89 ne prend pas en charge les jointures OUTER (DROITE, GAUCHE, FULL). La syntaxe ANSI-89 doit être considérée comme obsolète. Il y en a beaucoup sur SO qui ne votera pas pour la syntaxe ANSI-89 pour renforcer cela. Pour plus d'informations, voir cette question .

136
OMG Ponies

Dans votre instruction SELECT, vous devez préfacer votre identifiant avec la table dans laquelle vous souhaitez le choisir.

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

OR

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

Vous feriez cela en fournissant un nom complet, par exemple:

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

Ce qui vous donnerait l'id de tbl_names

6
halfdan

Il y a déjà beaucoup de réponses à votre question, vous pouvez le faire aussi. Vous pouvez donner à votre table un nom d'alias et l'utiliser dans la requête select comme ceci:

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

Ce que vous voulez probablement vraiment faire ici, c'est utiliser l'opérateur union comme ceci:

(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

Voici la documentation correspondante https://dev.mysql.com/doc/refman/5.0/fr/union.html

3
Bryan Legend

La solution la plus simple est une jointure avec USING au lieu de ON. De cette façon, la base de données "sait" que les deux colonnes id sont en fait les mêmes, et ne va pas cocher:

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

Si id est le seul nom de colonne commun à tbl_names et tbl_section, vous pouvez même utiliser un NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

Voir aussi: https://dev.mysql.com/doc/refman/5.7/en/join.html

2
vog

Si le format des identifiants dans les deux tables varie, vous souhaitez les joindre. Vous pouvez donc choisir d'utiliser un identifiant provenant d'une table principale, par exemple, si vous avez table_customes et table_orders, et L'identifiant pour les commandes ressemble à "101", "102" ... "11", utilisez-en simplement un pour les clients

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