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

Posted

技术标签:

【中文标题】1052:字段列表中的列“id”不明确【英文标题】:1052: Column 'id' in field list is ambiguous 【发布时间】:2011-10-02 02:01:00 【问题描述】:

我有 2 张桌子。 tbl_namestbl_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

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

【问题讨论】:

【参考方案1】:

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 语法来加强这一点。对于more information, see this question。

【讨论】:

令人困惑!因为实际上没有从 SQL 语言中删除任何内容,所以 SQL-89 是 SQL-92 的真子集。 OP 的语法是有效的 SQL-92 语法(并且。除非我遗漏了什么,否则你的语法是有效的 SQL-89 语法)。自 SQL-92 引入 NATURAL JOIN 以来,我认为 INNER JOIN 已“贬值”。【参考方案2】:

在您的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 语法。 同意,但问题是如何选择 id 字段。【参考方案3】:

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

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

这会给你 tbl_names 的 id

【讨论】:

查看我对 bluefeet 回答的评论 它不是一个“完全限定名称”,它是一个范围变量。当您省略一个显式范围变量时,SQL 会生成一个与表名相同的变量。为了更好地理解我的意思,请更改您的 FROM 子句 ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE... - 这就是解析器正在执行的生成范围变量的操作。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

如果idtbl_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

【讨论】:

【参考方案6】:

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

(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

【讨论】:

【参考方案7】:

如果两个表中 id 的格式不同,那么你想加入它们,因此你可以选择使用一个主表中的 id,比如你有 table_customestable_orders,然后你订单的 id 类似于 "101","102"..."110",客户只需使用一个

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

【讨论】:

【参考方案8】:
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id

【讨论】:

以上是关于1052:字段列表中的列“id”不明确的主要内容,如果未能解决你的问题,请参考以下文章

我的 Sql(MySQL 说:#1052 - 字段列表中的列 'hswhouse.whname' 不明确

Laravel JOIN SQLSTATE [23000] 问题:违反完整性约束:字段列表中的 1052 列“album_id”不明确

SQLSTATE [23000]:违反完整性约束:1052 where 子句中的列 'tenant_id' 不明确

完整性约束违规:字段列表中的 1052 列“updated_at”不明确

where 子句中的列“id”不明确

为什么我加入表时列变得不明确?