0

我不明白为什么解释器无法处理以下内容:

SELECT id
FROM a
  INNER JOIN b ON a.id = b.id

此查询将导致错误:Ambiguous column name 'id'

这是有道理的,因为在我的查询中的多个表中定义的列。但是,我明确表示只返回两个表的 id 相同的行。所以id来自哪个表并不重要。

所以只是出于好奇:解释器是否有理由要求该字段使用表格?

(我的示例来自 SQLServer,不确定其他解释器是否可以处理这个问题?)

4

3 回答 3

2

让我们清楚一些事情。首先,在引用列时包含表别名总是一个好主意。这使得 SQL 更容易理解。

其次,您假设由于=inon条件,这两个字段是相同的。这不是真的。是相同的。

例如,一个字段可以是int另一个float(我不建议使用float连接键,但它是允许的)。是什么类型的id?SQL 想给所有的列分配一个类型,并不清楚要分配什么类型。

更常见的例子比比皆是。一个id可能是主键并已定义NOT NULL。另一个可能是外键并且可以为空。just 的可空性是id什么?

换句话说,SQL 正在做正确的事情。这与 SQL 是否可以识别一些明显的东西无关,有时它可以识别。这是关于一个真正不明确的列并且 SQL 编译器不知道如何在SELECT子句中定义结果。

于 2013-08-13T14:35:32.247 回答
1

您如何期望解释器知道要使用哪一列?

由于它没有真正的大脑(可悲的是..!),您需要明确指定要从中获取 id 的表。

在这个例子中,它可能是:

SELECT a.id
FROM a
   INNER JOIN b ON a.id=b.id

即使 id 值相同,该列仍然必须来自解释器无法为您选择的表之一;-)

于 2013-08-13T14:31:51.003 回答
0

SELECT id 应该是 SELECT a.id 因为 id 在两个表中它不知道您指的是“哪一个”。

于 2013-08-13T14:31:52.810 回答