我有 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
我可以选择所有字段并避免错误。但这会浪费性能。我应该怎么办?
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。
在您的 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 语法。
您可以通过提供完全限定的名称来做到这一点,例如:
SELECT tbl_names.id as id, name, section FROM tbl_names, tbl_section WHERE tbl_names.id = tbl_section.id
这会给你 tbl_names 的 id
FROM
子句 ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...
- 这就是解析器正在执行的生成范围变量的操作。
您的问题已经有很多答案,您也可以这样做。你可以给你的表一个别名,并在选择查询中使用它,如下所示:
SELECT a.id, b.id, name, section
FROM tbl_names as a
LEFT JOIN tbl_section as b ON a.id = b.id;
最简单的解决方案是使用 USING
而不是 ON
进行联接。这样,数据库“知道”两个 id
列实际上是相同的,并且不会对此进行挑剔:
SELECT id, name, section
FROM tbl_names
JOIN tbl_section USING (id)
如果 id
是 tbl_names
和 tbl_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
您可能真正想要在这里做的是像这样使用联合运算符:
(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
如果两个表中 id 的格式不同,那么你想加入它们,因此你可以选择使用一个主表中的 id,比如你有 table_customes
和 table_orders
,以及 tha id 用于订单就像 "101","102"..."110",只给客户使用一个
select customers.id, name, amount, date from customers.orders;
SELECT tbl_names.id, tbl_names.name, tbl_names.section
FROM tbl_names, tbl_section
WHERE tbl_names.id = tbl_section.id
不定期副业成功案例分享
NATURAL JOIN
以来,我认为INNER JOIN
已“贬值”。