为什么这个子查询不会导致错误?

时间:2014-12-10 07:23:24

标签: sql-server

我对一个SQL查询感到困惑,老实说,这是我甚至不确定如何谷歌的事情之一。因此StackOverflow。

我认为这是一个简单的查询。

SELECT Id
FROM Customer
WHERE Id IN (SELECT Id from @CustomersWithCancelledOrders)

这是我发现奇怪的地方。 @CustomersWithCancelledOrders表变量中没有名为Id的列。但是没有错误。

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

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

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

我想我正在寻找的是上面“功能”的名称,某些信息是关于它为什么会这样做以及错误查询实际意味着什么。


我已经更新了上面的问题以使用稍微好一些的例子。它仍然是人为的,但它更接近我实际遇到问题时写的剧本。


在对相关子查询进行一些读取之后,看起来我的拼写错误(使用子查询中错误的Id列)会改变子查询的行为。

不是一次评估子查询的结果,而是将这些结果作为一个集合(这就是我的意图),它会为外部查询中的每一行评估子查询。

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

...

很难写下我对这个问题的理解的简明描述。抱歉。我觉得我现在很好。

3 个答案:

答案 0 :(得分:38)

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

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

例如;退房 http://support.microsoft.com/kb/298674

答案 1 :(得分:12)

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

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

参见此示例

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

答案 2 :(得分:1)

查询是一个相关的子查询,最常用于根据子查询返回的列限制外部查询的结果;因此相关的'。 在此示例中,内部查询中的ID实际上是外部查询中表的ID。这使查询有效,但可能无法为您提供任何有用的结果,因为它实际上不会在外部和内部查询之间进行关联。