2017-12-20 27 views
0

予期しない結果を返す非常に単純なサブクエリをMS SQLで作成しています。私が返そうとしているのは、ある期間に存在するが他の期間には存在しないacct番号のリストです。私の最初のクエリ(以下に貼り付け)は予期しないゼロの行を返しました。奇妙な結果を返すSQLサブクエリ

select 
    name1.acct 
from 
    sym.dbo.name as name1 
where 
    name1.processdate = 20171130 
    and name1.type = 0 
    and name1.acct not in 
    (
    select 
     name2.acct 
    from 
     sym.dbo.name as name2 
    where 
     name2.type = 0 
     and name2.processdate = 20171031 
    ) 

私は、サブクエリへのロジックの1つの余分の行を追加して実行する場合しかし、期待される結果は以下を参照してください、私に返されます。

select 
    name1.acct 
from 
    sym.dbo.name as name1 
where 
    name1.processdate = 20171130 
    and name1.type = 0 
    and name1.acct not in 
    (
    select 
     name2.acct 
    from 
     sym.dbo.name as name2 
    where 
     name2.type = 0 
     and name2.processdate = 20171031 
     and name2.acct <> '8888888' 
    ) 

は最初私はそれがデータに関連する可能性が考え私はVARCHARにACCT番号を変換しようとしたと同じ結果(対照としてキャストに変換を使用して)とint型。誰かが私に理由を説明することができますなぜクエリ1はゼロ結果を返し、クエリ2は期待された結果を返しましたか?私は、Microsoft SQL Management Studioを使用してい

おかげ

+1

はあなたが両方のクエリの結果を見ているものを検証するために、サンプルデータを表示することができますか? –

+0

日付の代わりに日付または日時のデータ型を使用することを検討してください。 –

答えて

3

は特にサブクエリで、NOT INを使用しないでください。あなたがちょうど学んだように、それは期待どおりに動作しません。問題? サブクエリによって返されるの値がNULLの場合、NOT INはすべてをフィルタリングします。

代わりに、NOT EXISTS使用:

where name1.processdate = 20171130 and 
     name1.type = 0 and 
     not exists (select 1 
        from sym.dbo.name name2 
        where name2.acct = name1.acct and 
         name2.processdate = 20171031 
       );