我不明白为什么解释器无法处理以下内容:
SELECT id
FROM a
INNER JOIN b ON a.id = b.id
此查询将导致错误:Ambiguous column name 'id'
这是有道理的,因为在我的查询中的多个表中定义的列。但是,我明确表示只返回两个表的 id 相同的行。所以id来自哪个表并不重要。
所以只是出于好奇:解释器是否有理由要求该字段使用表格?
(我的示例来自 SQLServer,不确定其他解释器是否可以处理这个问题?)
我不明白为什么解释器无法处理以下内容:
SELECT id
FROM a
INNER JOIN b ON a.id = b.id
此查询将导致错误:Ambiguous column name 'id'
这是有道理的,因为在我的查询中的多个表中定义的列。但是,我明确表示只返回两个表的 id 相同的行。所以id来自哪个表并不重要。
所以只是出于好奇:解释器是否有理由要求该字段使用表格?
(我的示例来自 SQLServer,不确定其他解释器是否可以处理这个问题?)
让我们清楚一些事情。首先,在引用列时包含表别名总是一个好主意。这使得 SQL 更容易理解。
其次,您假设由于=
inon
条件,这两个字段是相同的。这不是真的。值是相同的。
例如,一个字段可以是int
另一个float
(我不建议使用float
连接键,但它是允许的)。是什么类型的id
?SQL 想给所有的列分配一个类型,并不清楚要分配什么类型。
更常见的例子比比皆是。一个id
可能是主键并已定义NOT NULL
。另一个可能是外键并且可以为空。just 的可空性是id
什么?
换句话说,SQL 正在做正确的事情。这与 SQL 是否可以识别一些明显的东西无关,有时它可以识别。这是关于一个真正不明确的列并且 SQL 编译器不知道如何在SELECT
子句中定义结果。
您如何期望解释器知道要使用哪一列?
由于它没有真正的大脑(可悲的是..!),您需要明确指定要从中获取 id 的表。
在这个例子中,它可能是:
SELECT a.id
FROM a
INNER JOIN b ON a.id=b.id
即使 id 值相同,该列仍然必须来自解释器无法为您选择的表之一;-)
SELECT id 应该是 SELECT a.id 因为 id 在两个表中它不知道您指的是“哪一个”。