在SQL Server中重写Access Query的问题

时间:2011-07-07 15:25:12

标签: sql-server ms-access

我目前正在尝试在SQL服务器中复制MS Access查询,我在此查询中遇到了一些问题。

我正在运行使用我的新查询在SQL服务器中获取太多记录。 原始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)

        )

正如您所看到的,我合并了OR子句中2个原始WHERE语句中的项目,因为唯一的区别是这个

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

我知道问题来自SQL服务器中的B.BR<>'C2' Or B.BR<>'TA'。它仍包括具有'C2'和'TA'值的项目,即使它们应被排除在外。我无法弄清楚如何纠正这个问题。建议?

1 个答案:

答案 0 :(得分:2)

很难确定你得到了哪些额外的行,但我怀疑它们是B.BR是'C2'或'TA'的行。由于以下内容无法同时消除这两个值:

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

请尝试以下方法:

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