我目前正在尝试在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'值的项目,即使它们应被排除在外。我无法弄清楚如何纠正这个问题。建议?
答案 0 :(得分:2)
很难确定你得到了哪些额外的行,但我怀疑它们是B.BR是'C2'或'TA'的行。由于以下内容无法同时消除这两个值:
B.BR <> 'C2' OR B.BR <> 'TA'
请尝试以下方法:
B.BR NOT IN ('C2', 'TA')