Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server 为什么此子查询不会导致错误?_Sql Server - Fatal编程技术网

Sql server 为什么此子查询不会导致错误?

Sql server 为什么此子查询不会导致错误?,sql-server,Sql Server,我被一个SQL查询弄糊涂了,老实说,这是我甚至不知道如何用谷歌搜索的东西之一。因此,堆栈溢出 我有一个简单的问题 SELECT Id FROM Customer WHERE Id IN (SELECT Id from @CustomersWithCancelledOrders) 这就是我发现奇怪之处的地方。@CustomerWithCanceledOrders表变量中没有名为Id的列。但是没有错误 这将导致所有客户的ID。每一个。这显然违背了首先进行子查询的目的 这就像使用外部表Custome

我被一个SQL查询弄糊涂了,老实说,这是我甚至不知道如何用谷歌搜索的东西之一。因此,堆栈溢出

我有一个简单的问题

SELECT Id
FROM Customer
WHERE Id IN (SELECT Id from @CustomersWithCancelledOrders)
这就是我发现奇怪之处的地方。@CustomerWithCanceledOrders表变量中没有名为Id的列。但是没有错误

这将导致所有客户的ID。每一个。这显然违背了首先进行子查询的目的

这就像使用外部表Customers中的Id列一样,但我不明白它为什么会这样做。你想这么做有什么理由吗?我错过了一些非常明显的东西吗

奇怪的感觉。它不是最好的SQL工具,因为我找不到在该网站上返回多个结果集的方法,但它演示了我是如何处理这个问题的

我想我要找的是上面特性的名称,一些关于它为什么这样做以及错误查询的实际含义的信息

我更新了上面的问题,使用了一个稍微好一点的例子。这仍然是人为的,但它更接近我在实际遇到问题时写的脚本

在对相关子查询进行了一些阅读之后,我在子查询中使用错误Id列的打字似乎改变了子查询的行为

它不是对子查询的结果求值一次,然后将这些结果作为一个集合来处理,而是对外部查询中的每一行求值

这意味着子查询对每一行计算一组不同的结果,并且该结果集保证包含该行的客户Id。子查询返回一个集合,该集合由重复X次的行Id组成,其中X是从中选择的表变量中的行数


很难简明扼要地描述我对这个问题的理解。很抱歉不过,我认为我现在很好。

这是预期的行为,因为在子查询中,您可以访问“外部查询”列名。这意味着您可以在子查询中使用表中的Id,因此查询认为您正在使用Id

这就是为什么在处理子查询时,应该使用别名或完全限定名来限定

比如,;退房

这将产生一个错误。正如Allan S.Hanses所说,在子查询中,可以使用主查询中的列

看这个例子

SELECT ID
FROM [Table]
WHERE ID IN (SELECT ID)

查询是一个相关子查询,最常用于根据子查询返回的列限制外部查询的结果;因此“相关”。
在本例中,内部查询中的ID实际上是外部查询中表的ID。这使得查询有效,但可能不会提供任何有用的结果,因为它实际上并不与外部查询和内部查询相关。

这澄清了我所假设的预期行为。然而,这个查询实际上意味着什么?查找表中的所有Id值,其中Id值位于所描述的值集中?查询的基本意思是:从SELECT Table中的Id所在的表中选择Id。从OtherTable中选择Id,这就是它返回所有内容的原因,只要OtherTable中有任何行。如果子查询中有行,它将从子查询中选择所有Table.Id。尝试在你的fiddle示例中注释插入CustomerMap。顺便说一句,很难说你是新手还是简化了一个有效案例,但大多数情况下,您可能应该连接表,而不是使用子查询。您要查找的技术术语是关联子查询。@JamesRyan我昨天写了一个快速查询,碰巧写了一个类似于上述内容的更新查询。在子查询中使用外部ID是一个输入错误,当它更新表中的所有记录而不是我想要的子集时,我感到非常惊讶。
SELECT ID
FROM [Table]
WHERE ID IN (SELECT ID)