SQL:关键字段上的歧义
我不明白为什么口译员不能处理以下问题:SQL:关键字段上的歧义,sql,relational-database,Sql,Relational Database,我不明白为什么口译员不能处理以下问题: SELECT id FROM a INNER JOIN b ON a.id = b.id 此查询将导致错误:不明确的列名“id” 这很有意义,因为中的列在我的查询中的多个表中定义。但是,我明确声明只返回两个表的id相同的行。所以id来自哪个表并不重要 出于好奇:口译员为什么要求现场有一张桌子 (我的例子来自SQLServer,不确定其他解释器是否可以处理这个问题?如何让解释器知道使用哪个列 因为它没有真正的大脑(遗憾的是…),所以您需要明确地指定要从
SELECT id
FROM a
INNER JOIN b ON a.id = b.id
此查询将导致错误:不明确的列名“id”
这很有意义,因为中的列在我的查询中的多个表中定义。但是,我明确声明只返回两个表的id相同的行。所以id来自哪个表并不重要
出于好奇:口译员为什么要求现场有一张桌子
(我的例子来自SQLServer,不确定其他解释器是否可以处理这个问题?如何让解释器知道使用哪个列 因为它没有真正的大脑(遗憾的是…),所以您需要明确地指定要从中获取id的表 在本例中,可能是:
SELECT a.id
FROM a
INNER JOIN b ON a.id=b.id
即使id值相同,该列仍然必须来自解释器无法为您选择的表之一;-) 你如何让口译员知道使用哪一列 因为它没有真正的大脑(遗憾的是…),所以您需要明确地指定要从中获取id的表 在本例中,可能是:
SELECT a.id
FROM a
INNER JOIN b ON a.id=b.id
即使id值相同,该列仍然必须来自解释器无法为您选择的表之一;-) SELECT id应该是SELECT a.id,因为id在两个表中都不知道您指的是“哪一个”。SELECT id应该是SELECT a.id,因为id在两个表中都不知道您指的是“哪一个”。让我们明确几点。首先,在引用列时最好包含表别名。这使得SQL更容易理解 其次,您假设由于
=
条件中的=
,这两个字段是相同的。事实并非如此。这些值是相同的
例如,一个字段可以是int
,另一个是float
(我不建议对连接键使用float
,但这是允许的)。id
的类型是什么?SQL希望为所有列分配一个类型,但不清楚要分配什么类型
更常见的例子比比皆是。一个id
可能是主键,定义为不为NULL
。另一个可能是外键,并且可以为空。justid
的可空性是什么
换句话说,SQL正在做正确的事情。这与SQL是否能够识别某些明显的东西无关,有时它确实能够识别。这是关于一个列实际上是不明确的,并且SQL编译器不知道如何在
SELECT
子句中定义结果。让我们澄清一些事情。首先,在引用列时最好包含表别名。这使得SQL更容易理解
其次,您假设由于=
条件中的=
,这两个字段是相同的。事实并非如此。这些值是相同的
例如,一个字段可以是int
,另一个是float
(我不建议对连接键使用float
,但这是允许的)。id
的类型是什么?SQL希望为所有列分配一个类型,但不清楚要分配什么类型
更常见的例子比比皆是。一个id
可能是主键,定义为不为NULL
。另一个可能是外键,并且可以为空。justid
的可空性是什么
换句话说,SQL正在做正确的事情。这与SQL是否能够识别某些明显的东西无关,有时它确实能够识别。这是关于一个列真正不明确,SQL编译器不知道如何在
SELECT
子句中定义结果的问题。但是解释器不能做出决定是否有限制?限制是引擎必须从其中一个表中获取信息,即使值相同,DBMS不是为我们选择的。@Hazaart:如果解释器可以做出决定,它应该如何选择使用哪一列?它应该使用a.id
吗?为什么?或者它应该使用b.id
-为什么???例如,它可以选择“a”,因为它是包含该字段的SELECT中的第一个表。但正如戈登所指出的,这两个专栏并不一定相同。因此,解释器无法做出决定。但解释器无法做出决定的原因是否存在限制?限制是引擎必须从其中一个表中获取信息,即使值相同,DBMS不是为我们选择的。@Hazaart:如果解释器可以做出决定,它应该如何选择使用哪一列?它应该使用a.id
吗?为什么?或者它应该使用b.id
-为什么???例如,它可以选择“a”,因为它是包含该字段的SELECT中的第一个表。但正如戈登所指出的,这两个专栏并不一定相同。因此,口译员无法做出决定。谢谢您的明确回答!有更多的加入比我第一次想到的。谢谢你的明确回答!连接比我最初想到的要多得多。好吧,如果解释器可以做出决定——它应该如何选择使用哪个列?它应该使用a.id
吗?为什么?或者它应该使用b.id
-为什么???如果解释器可以做出决定-它应该如何选择使用哪一列?它应该使用a.id
吗?为什么?或者应该使用b.id
-为什么???