我对SQL查询感到困惑,老实说,这是我甚至不确定如何谷歌的东西之一.因此StackOverflow.
我认为这是一个简单的查询.
SELECT Id
FROM Customer
WHERE Id IN (SELECT Id from @CustomersWithCancelledOrders)
Run Code Online (Sandbox Code Playgroud)
这是我发现奇怪的地方.@CustomersWithCancelledOrders表变量中没有名为Id的列.但没有错误.
这导致所有客户的ID.每一个.这显然违背了首先进行子查询的要点.
这就像它使用外表(客户)中的Id列,但我不明白为什么会这样做.有没有理由你想这样做?我错过了一些非常明显的东西吗?
SQLFiddle的怪异.它不是最好的SQL小提琴,因为我找不到在该网站上返回多个结果集的方法,但它演示了我如何处理该问题.
我想我正在寻找的是上面"功能"的名称,某些信息是关于它为什么做它做什么以及错误查询实际意味着什么.
我已经更新了上面的问题以使用稍微好一些的例子.它仍然是人为的,但它更接近我实际遇到问题时写的剧本.
在对相关子查询进行一些读取之后,看起来我的拼写错误(使用子查询中的错误Id列)会更改子查询的行为.
而不是一次评估子查询的结果,然后将这些结果作为一个集合(这就是我的意图),它会为外部查询中的每一行计算子查询.
这意味着子查询为每行评估一组不同的结果,并保证该组结果中包含该行的客户ID.子查询返回一个由重复X次的行的Id组成的集合,其中X是从中选择的表变量中的行数.
...
很难写下我对这个问题的理解的简明描述.抱歉.我觉得我现在很好.
All*_*sen 38
这是预期的行为,因为在子查询中,您可以访问"外部查询"列名称.这意味着您可以在子查询中使用表中的Id,因此查询认为您正在使用Id.
这就是为什么在处理子查询时应该使用别名或完全限定名称进行限定的原因.
例如; 请查看
http://support.microsoft.com/kb/298674
Ciu*_*caS 11
SELECT ID
FROM [Table]
WHERE ID IN (SELECT OtherTable.ID FROM OtherTable)
Run Code Online (Sandbox Code Playgroud)
这将产生错误.正如Allan S. Hanses所说,在子查询中,您可以使用主查询中的列.
看这个例子
SELECT ID
FROM [Table]
WHERE ID IN (SELECT ID)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1853 次 |
最近记录: |