首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么此子查询不会导致错误?

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

Stack Overflow用户
提问于 2014-12-10 15:23:24
回答 3查看 2.5K关注 0票数 18

我被一个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是从中选择的表变量中的行数。

..。

真的很难写下我对这个问题的理解的简明描述。抱歉的。我想我现在已经很好了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-10 15:28:26

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

这就是为什么在使用子查询时,您应该使用别名或完全限定名进行限定。

例如;检出

http://support.microsoft.com/kb/298674

票数 39
EN

Stack Overflow用户

发布于 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)
票数 11
EN

Stack Overflow用户

发布于 2014-12-10 23:40:13

查询是相关子查询,最常用于根据子查询返回的列限制外部查询的结果;因此称为“相关”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27395354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档