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

94

J'ai 2 tables. tbl_nameset tbl_sectionqui a à la fois le idchamp en eux. Comment puis-je sélectionner le idchamp, car j'obtiens toujours cette erreur:

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 un gaspillage de performances. Que devrais-je faire?

Wern Ancheta
la source

Réponses:

152

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 sont-elles différentes?

Deuxièmement, mes réponses utilisent la syntaxe ANSI-92 JOIN (la vôtre est ANSI-89). Bien qu'ils effectuent la même chose, la syntaxe ANSI-89 ne prend pas en charge les jointures EXTERNES (DROITE, GAUCHE, PLEIN). La syntaxe ANSI-89 devrait être considérée comme obsolète, il y en a beaucoup sur SO qui ne voteront pas pour la syntaxe ANSI-89 pour renforcer cela. Pour plus d'informations, consultez cette question .

Poneys OMG
la source
Déroutant! Parce que rien n'est réellement supprimé du langage SQL, SQL-89 est un sous-ensemble approprié de SQL-92. La syntaxe de l'OP est une syntaxe SQL-92 valide (et à moins que je ne manque quelque chose, la vôtre est une syntaxe SQL-89 valide). Je considère INNER JOINcomme «déprécié» depuis l'introduction de SQL-92 NATURAL JOIN.
jour du
16

Dans votre SELECTdéclaration, vous devez faire précéder votre identifiant du tableau dans lequel vous souhaitez le choisir.

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
la source
Cela ne renvoie qu'un des idchamps; l'OP déclare «il suffit de sélectionner tous les champs et d'éviter l'erreur». Et je ne vote pas pour la syntaxe ANSI-89.
OMG Ponies
D'accord, mais la question était de savoir comment sélectionner le champ id.
Taryn
6

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'identifiant de tbl_names

Halfdan
la source
Voir mon commentaire à la réponse de bluefeet
OMG Ponies
Ce n'est pas un «nom complet», c'est une variable de plage. Lorsque vous omettez une variable de plage explicite, SQL en génère une qui est identique au nom de la table. Pour mieux voir ce que je veux dire, changez votre FROMclause ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- c'est ce que fait l'analyseur pour générer une variable de plage.
jour du
4

La solution la plus simple est une jointure avec USINGau lieu de ON. De cette façon, la base de données "sait" que les deux idcolonnes sont en fait les mêmes et ne s'en occupera pas:

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

Si idest le seul nom de colonne courant dans tbl_nameset 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

vog
la source
3

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 pour cela https://dev.mysql.com/doc/refman/5.0/en/union.html

Bryan Légende
la source
3

Il y a déjà beaucoup de réponses à votre question, vous pouvez le faire comme ça aussi. Vous pouvez donner à votre table un nom d'alias et l'utiliser dans la requête de sélection 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;
MJ
la source
0

Si le format des identifiants dans les deux tables varie, vous souhaitez les joindre, vous pouvez donc choisir d'utiliser un identifiant d'une table principale, par exemple si vous avez table_customeset table_orders, et que l'identifiant des commandes est comme " 101 ", " 102 " ... " 110 ", utilisez-en un pour les clients

select customers.id, name, amount, date from customers.orders;
Festole
la source
-1
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
Nikunj
la source