0

我有一个 Access UDA,它使用了我很久以前整理的一些 VBA/SQL 代码,最近有人要求我调整特定查询以排除两个条件。我以为我可以简单地添加一个 SQL AND OR 语句,但我在尝试让这个简单的修复工作时遇到了很多麻烦。

我的原始代码:

SELECT * FROM [Master List] 
WHERE ([Master List].IB)='" & strIBTO & "' AND ([Master List].[Type])<>'N'"

这将正确返回不包括 Type = "N" 的特定传递变量 "strIBTO" 的结果。

本质上,要求也是从查询中排除另一个类型,所以我修改了代码:

SELECT * FROM [Master List] 
WHERE ([Master List].IB)='" & strIBTO & "' AND ([Master List].[Type])<>'N' OR ([Master List].[Type])<>'T'" 

现在看来,Access 正在抛弃我的整个 AND 语句,因为我得到的结果中同时包含“N”和“T”。尝试了用括号括住整个 AND 语句和内部的各种排列,但无法获得正确的结果。

VBA SQL 在嵌套 AND/OR 方面与 MySQL 不同吗?我究竟做错了什么?

4

3 回答 3

2

如果我理解正确,除了类型“N”之外,您还试图排除类型“T”。有几个选项,包括但不限于:

SELECT * FROM [Master List] 
WHERE ([Master List].IB)='" & strIBTO & "'
AND ([Master List].[Type])<>'N'
AND ([Master List].[Type])<>'T'

或(更容易再次更新)

SELECT * FROM [Master List] 
WHERE ([Master List].IB)='" & strIBTO & "'
AND ([Master List].[Type]) NOT IN ('N', 'T')
于 2013-09-11T22:45:19.607 回答
0

这是基本的布尔代数!

[Master List].[Type]<>'N' OR [Master List].[Type]<>'T'将永远返回整套!

反过来想: 会从集合中[Master List].[Type]='N' OR [Master List].[Type]='T'返回Ns 更多的 s。T

对此的否定是:

[Master List].[Type]<>'N' AND [Master List].[Type]<>'T'
于 2013-09-12T13:39:05.930 回答
0

在我看来,您没有正确包围。替换这个:

WHERE ([Master List].IB)='" & strIBTO & "' AND ([Master List].[Type])<>'N' OR ([Master List].[Type])<>'T'"

有了这个:

WHERE ([Master List].IB)='" & strIBTO & "' AND (([Master List].[Type])<>'N' AND ([Master List].[Type])<>'T') 

正确括号后,您必须将 OR 更改为 AND,就像我在上面所做的那样。

于 2013-09-11T22:46:32.560 回答