我被一个SQL查询搞糊涂了,老实说,这是我甚至不知道如何用谷歌搜索的东西之一。因此,StackOverflow。
我有一个我认为是简单的查询。
SELECT Id
FROM Customer
WHERE Id IN (SELECT Id from @CustomersWithCancelledOrders)
这就是我觉得奇怪的地方。在@CustomersWithCancelledOrders表变量中没有名为Id的列。但是没有错误。
这样就得到了所有客户的Ids。每一个人。这显然在一开始就失去了执行子查询的意义。
这就像它使用外部表(Customers)中的Id列一样,但我不明白它为什么要这样做。有没有什么理由让你这么做呢?我是不是漏掉了什么非常明显的东西?
怪异的SQLFiddle。这不是最好的SQL Fiddle,因为我无法找到在该网站上返回多个结果集的方法,但它演示了我是如何遇到这个问题的。
我想我正在寻找的是上面“功能”的名称,一些关于它为什么要做什么的信息,以及不正确的查询的实际含义。
我已经更新了上面的问题,使用了一个稍微好一点的例子。它仍然是人为的,但它更接近于我在实际遇到问题时编写的脚本。
在对相关子查询进行了一些阅读之后,看起来我的拼写错误(在子查询中使用了错误的Id列)改变了子查询的行为。
它不是对子查询的结果进行一次求值,然后将这些结果视为一个集合(这正是我想要的),而是针对外部查询中的每一行对子查询求值。
这意味着该子查询针对每一行计算为一组不同的结果,并且这组结果保证其中包含该行的客户Id。子查询返回一个由重复X次的行的Id组成的集合,其中X是从中选择的表变量中的行数。
..。
真的很难写下我对这个问题的理解的简明描述。抱歉的。我想我现在已经很好了。
发布于 2014-12-10 15:28:26
这是有意为之的行为,因为在子查询中,您可以访问“外部查询”列名。这意味着您可以在子查询中使用表中的Id,因此查询会认为您使用的是Id。
这就是为什么在使用子查询时,您应该使用别名或完全限定名进行限定。
例如;检出
发布于 2014-12-10 16:44:16
SELECT ID
FROM [Table]
WHERE ID IN (SELECT OtherTable.ID FROM OtherTable)
这将生成一个错误。正如Allan S.Hanses所说,在子查询中,您可以使用主查询中的列。
请参阅此示例
SELECT ID
FROM [Table]
WHERE ID IN (SELECT ID)
发布于 2014-12-10 23:40:13
查询是相关子查询,最常用于根据子查询返回的列限制外部查询的结果;因此称为“相关”。
https://stackoverflow.com/questions/27395354
复制相似问题