114

我有 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

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

4

8 回答 8

179

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 语法来加强这一点。有关详细信息,请参阅此问题

于 2011-07-10T01:31:35.683 回答
20

在您的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
于 2011-07-10T01:11:48.577 回答
6

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

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

这会给你 tbl_names 的 id

于 2011-07-10T01:12:07.703 回答
4

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

SELECT a.id, b.id, name, section
FROM tbl_names as a 
LEFT JOIN tbl_section as b ON a.id = b.id;
于 2016-05-25T06:28:54.673 回答
4

最简单的解决方案是 join withUSING而不是ON。这样,数据库“知道”两id列实际上是相同的,并且不会对此进行挑剔:

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

如果是andid中唯一常见的列名,您甚至可以使用 a :tbl_namestbl_sectionNATURAL JOIN

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

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

于 2018-06-15T20:21:31.797 回答
3

您可能真正想要在这里做的是像这样使用联合运算符:

(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

这是它的文档https://dev.mysql.com/doc/refman/5.0/en/union.html

于 2015-05-28T20:34:28.187 回答
0

如果两个表中 id 的格式不同,那么你想加入它们,因此你可以选择使用一个主表中的 id,比如如果你有table_customesand table_orders,并且订单的 tha id 就像“ 101 ”, “ 102 ”...“ 110 ”,给客户用一个

select customers.id, name, amount, date from customers.orders;
于 2014-03-23T06:16:43.150 回答
-1
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
于 2017-05-22T13:47:23.383 回答