2011-07-07 4 views
0

現在、SQLサーバでMS Accessクエリを複製しようとしていますが、このクエリで問題が発生しています。SQLサーバでアクセスクエリを書き直す際の問題

新しいクエリを使用してSQLサーバーに記録が多すぎます。 オリジナルMS Accessクエリは - あなただけので、私はWHERE句の2元OR文からアイテムを組み合わせて見ることができるように64632のレコードの

SELECT DISTINCT * FROM Deb D INNER JOIN Bals B ON D.ID = B.ID 
WHERE 
(
    D.ID > 9999999 
    AND (B.TYPE <> 'DV' Or B.TYPE Is Null) 
    AND (D.SEC < 9999800 And D.SEC <> 9999000 And D.SEC <>9999100) 
    AND (B.BR<>'C2' Or B.BR<>'TA') 
) 
OR 
(
    D.ID > 9999999 
    AND (B.TYPE <> 'DV' Or B.TYPE Is Null) 
    AND (D.SEC < 9999800 And D.SEC <> 9999000 And D.SEC <>9999100) 
    AND B.BR Is Null 
) 

を生産する新しいSQLのバージョンは64658のレコードの

SELECT DISTINCT * FROM Deb D INNER JOIN Bals B ON D.ID = B.ID 
WHERE 
    D.ID > 9999999 
    AND (B.TYPE <> 'DV' Or B.TYPE Is Null) 
    AND (D.SEC < 9999800 And D.SEC <> 9999000 And D.SEC <>9999100) 
    AND (
      (B.BR<>'C2' Or B.BR<>'TA') 
      Or 
      (B.BR Is Null) 

     ) 

を生成します違いはこれでした

私は問題がから来ていることを知っていますSQLサーバーの除外すべきものであるにもかかわらず、 'C2'と 'TA'の値を持つアイテムはまだ含まれています。私はこれを修正する方法を理解することはできません。提案?

+0

試し 'B.BR <> 'C2' AND B.BR <> 'TA'' –

答えて

2

取得する余分な行を特定するのは難しいですが、B.BRが 'C2'または 'TA'の行であると思われます。以下は、同時に両方の値を排除することはできませんので:

B.BR <> 'C2' OR B.BR <> 'TA' 

は、代わりに次のことを試してみてください。

B.BR NOT IN ('C2', 'TA') 
+0

それはうまくいくようでした。 (B.ACCT_TYPE_IND <> 'DV'またはB.ACCT_TYPE_INDはヌル) – Taryn

+1

私はそうではないと思いますが、IS NULL条件2つの正確な値の比較とは異なるタイプの検査です。これを試してください:DECLARE @x TABLE(VARCHAR(4)); INSERT @x SELECT 'BV' UNION SELECT 'DV' UNION SELECT NULL; 'DV'またはa NULLであるかどうかを@x FROMから選択します。 –

関連する問題