我有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:
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语法。有关更多信息,请参见此问题。
在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...
-解析器正在执行此操作以生成范围变量。
最简单的解决方案是使用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
您可能真正想要在这里做的是使用并运算符,如下所示:
(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
INNER JOIN
自从SQL-92引入以来,我认为它已“贬值”NATURAL JOIN
。