2011-07-07 68 views
0

我目前正在嘗試複製SQL服務器中的MS Access查詢,並且遇到了一些有關此查詢的問題。在SQL服務器中重寫訪問查詢的問題

我正在使用我的新查詢在SQL Server中獲取太多記錄。 原始MS Access查詢 - 產生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) 

     ) 

正如你可以看到我結合WHERE條款,因爲只有在從2個原OR報表項目區別是這

(B.BR<>'C2' Or B.BR<>'TA') 
Or 
(B.BR Is Null) 

我知道問題來自B.BR<>'C2' Or B.BR<>'TA'在SQL服務器中。它仍然包括'C2'和'TA'值的項目,儘管它們應該被排除。我無法弄清楚如何解決這個問題。建議?

+0

試'B.BR <> 'C2' 和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條件是兩種精確值比較的不同類型的檢查。試試這個:DECLARE @x TABLE(a VARCHAR(4)); INSERT @x SELECT'BV'UNION SELECT'DV'UNION SELECT NULL; SELECT a FROM @x WHERE a <>'DV'or a IS NULL; –

+0

感謝您的幫助,它現在正在工作。 – Taryn