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