2

SQL Server のクエリで奇妙な動作に遭遇しました

2 つのテーブルがPrepaidTransactionsありBillingData、次のクエリを実行しています

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

customer_Idはテーブルに属していませんBillingDataPrepaidTransactionsエラーを表示する代わりに、クエリが実行され、テーブルからすべてのレコードが返されます

しかし、次のクエリを実行すると

Select customer_Id 
from BillingData 
where CommunityId = 10004

それはエラーを示しています

列名 'customer_Id' が無効です。

最初のクエリでエラーが表示されない理由を教えてください。

4

2 に答える 2

3

この 2 つの記事があなたの質問に答えていると思います。

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 を指定すると、失敗します。記事は、あいまいさを避けるためにこの慣行に従うように言っています。

于 2014-03-15T07:53:01.650 に答える
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)

私はそのエラーに賭けますか?

于 2014-03-15T07:46:41.327 に答える