2009-05-15 20 views
1

次のクエリが異なる結果セットを返すのはなぜですか?異なるSQL結果はなぜですか?

select count(ml.link_type),mc.conv_string 
from MSP_CONVERSIONS mc,MSP_LINKS ml 
where ml.PROJ_ID = 4 
and mc.STRING_TYPE_ID = 3 
and mc.CONV_VALUE *= ml.link_type 
group by mc.conv_string 

select count(ml.link_type),mc.conv_string 
from MSP_CONVERSIONS mc left outer join MSP_LINKS ml on mc.CONV_VALUE = ml.LINK_TYPE 
where ml.PROJ_ID = 4 
and mc.STRING_TYPE_ID = 3 
group by mc.conv_string 

最初のクエリが返す:

3 FF

10790 FS

0 SF

117 SS

2番目のクエリが返す:

3 FFは

10790 FS

117 SSは

両方のクエリは、SQL Server 2008の標準データベースに対して実行されます。なぜ2つの異なる結果セットが返されるのか理解できません。私は* =がLEFT OUTER JOINの簡略構文だと思った。私はこれほど長い間これを見てきました。

おかげで...

答えて

4

あなたの最初のクエリが、これには本当に同等であるので:

select count(ml.link_type),mc.conv_string 
from MSP_CONVERSIONS mc 
LEFT JOIN MSP_LINKS ml 
    ON ml.PROJ_ID = 4 
    and mc.STRING_TYPE_ID = 3 
    and mc.CONV_VALUE = ml.link_type 
group by mc.conv_string 

あなたはそれが不可能今まで完全に任意のをフィルタリングすること、アップ参加へのすべての条件を引っ張ってきましたMSP_CONVERSIONSテーブルの行。常にLEFT/INNER JOIN構文を完全に守り、混乱を避けることをお勧めします。

+0

答えをいただきありがとうございます。しかし、提供したクエリの例では、すべてのmc.conv_stringが返されます。私は、必要に応じて このクエリは、物事を返します。 SELECT COUNT(ml.link_type)を、MSP_CONVERSIONS MC LEFT OUTERから をmc​​.conv_string登録しようMSP_LINKSミリリットル ON mc.CONV_VALUE = ml.link_type とml.PROJ_ID = 4 mc.STRING_TYPE_ID = 3 グループby mc.conv_string ご協力ありがとうございます。 –

2

"* ="古い形式のANSI OUTER JOIN構文と同じくらい簡略化された構文です。それを使用しないでください。また、一般的に、選択肢に "LEFT OUTER JOIN b ..."がある場合、WHERE句の "b"に条件を追加するのは悪い考えです。結果としてフィルタリングとして読み込まれた場合bのマッチがなかった行をすべて破棄します。つまり、外部結合を効果的に内部結合に変換します。

これは、Joelが書いたことと結びついています。つまり、 "ON"句のすべての条件を指定すると、フィルタリングは結合時に適用され、別の結果になります。 ANSI構文はより明示的です。

+0

+1 - ANSI-89構文は悪です。 SQL Serverは、実際にはANSI-92(明示的な結合)構文を多くの状況でより効率的に処理するため、明示的な結合に固執するのが最適です。 –

+0

誤って解釈される可能性があり、正しい結果がSQL Server 2000のように遠くまでも得られないため、これも使用しないでください。これは単なる悪いコードです。また、廃止予定です。 – HLGEM

関連する問題