1052:字段列表中的列“ id”不明确


94

我有2张桌子。tbl_names并且tbl_section两者都有id。如何选择id字段,因为我总是会收到此错误:

1052: Column 'id' in field list is ambiguous

这是我的查询:

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

我可以选择所有字段并避免错误。但这将浪费性能。我该怎么办?

Answers:


152

SQL支持通过为引用加上全表名作为前缀来对列进行限定:

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

...或表别名:

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

推荐使用表别名-为什么键入的文字比您需要的多?

为什么这些查询看起来不同?

其次,我的答案使用ANSI-92 JOIN语法(您使用的是ANSI-89)。尽管它们执行相同的操作,但ANSI-89语法不支持OUTER连接(RIGHT,LEFT,FULL)。应该认为ANSI-89语法已被弃用,SO上有很多人不会投票支持ANSI-89语法。有关更多信息,请参见此问题


令人困惑!由于实际上没有从SQL语言中删除任何内容,因此SQL-89是SQL-92的适当子集。OP的语法是有效的SQL-92语法(并且,除非我缺少某些内容,否则您的语法是有效的SQL-89语法)。INNER JOIN自从SQL-92引入以来,我认为它已“贬值” NATURAL JOIN
一天,

16

SELECT声明中,您需要在ID前面加上要从中选择的表。

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

要么

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

这仅返回一个id字段;OP指出“只需选择所有字段并避免错误”。而且,我不支持ANSI-89语法。
OMG小马

同意,但问题是如何选择id字段。
塔林

6

您可以通过提供一个完全限定的名称来做到这一点,例如:

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

这将为您提供tbl_names的ID


请参阅我对bluefeet答案的评论
OMG小马

它不是“完全限定名称”,而是一个范围变量。省略显式范围变量时,SQL会生成一个与表名称相同的变量。为了更好地理解我的意思,请更改您的FROM子句...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...-解析器正在执行此操作以生成范围变量。
某天,

4

最简单的解决方案是使用USING代替ON。这样,数据库“知道”两id列实际上是相同的,并且不会对此:

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

如果id是在唯一的共同列名tbl_namestbl_section,你甚至可以使用NATURAL JOIN

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

另请参见:https : //dev.mysql.com/doc/refman/5.7/en/join.html



3

您的问题已经有很多答案,您也可以这样做。您可以为表指定别名,并在选择查询中使用它,如下所示:

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

0

如果两个表中ID的格式不同,那么您想将它们合并,因此您可以选择使用一个主表中的ID,例如,如果您有table_customestable_orders,则订单的ID如“ 101 ”, “ 102 ” ...“ 110 ”,只为客户使用一个

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.