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