SQL Server查询奇怪的行为

时间:2014-03-15 07:41:58

标签: sql sql-server execution query-expressions

我在SQL Server中遇到了一个奇怪的行为

我有两个表PrepaidTransactionsBillingData,我正在执行以下查询

Select * 
from PrepaidTransactions 
where customer_Id in
                  (Select customer_Id 
                   from BillingData 
                   where CommunityId = 10004)

customer_Id不属于表BillingData。查询正在执行并返回PrepaidTransactions

中的所有记录,而不是显示错误

但是当我运行以下查询时

Select customer_Id 
from BillingData 
where CommunityId = 10004

显示错误

  

列名称'customer_Id'无效。

任何人都可以让我知道为什么第一个查询没有显示任何错误?

2 个答案:

答案 0 :(得分:3)

我认为这两篇文章回答了你的问题。

https://connect.microsoft.com/SQLServer/feedback/details/542289/subquery-with-error-does-not-cause-outer-select-to-fail

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

这是预期的行为,因为您的列名未绑定到表。因此,如果可以在外部表中解析(在查询的情况下,它可以),则子查询不会失败。如果指定表BillingData.customer_Id,则会出现故障。文章说要遵循这种做法以避免含糊不清。

答案 1 :(得分:2)

哇!我认为在你的第一种情况下,customer_Id被从外部查询中拉出来。您可以通过执行表前缀来测试它:

Select * from PrepaidTransactions where customer_Id in
(Select PrepaidTransactions.customer_Id from BillingData where CommunityId = 10004)

获得相同的结果,但

Select * from PrepaidTransactions where customer_Id in
(Select BillingData.customer_Id from BillingData where CommunityId = 10004)

我打赌这些错误?