Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:关键字段上的歧义_Sql_Relational Database - Fatal编程技术网

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
。另一个可能是外键,并且可以为空。just
id
的可空性是什么


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

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

其次,您假设由于
=
条件中的
=
,这两个字段是相同的。事实并非如此。这些值是相同的

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

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


换句话说,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
-为什么???