MS Access 查询产生意外结果(图示)

MS Access query producing an unexpected result (illustrated)

提问人:thanks_in_advance 提问时间:4/26/2023 最后编辑:thanks_in_advance 更新时间:4/29/2023 访问量:62

问:

(免责声明:本数据库中没有真实姓名。数据库来自GCF [Goodwill Community Foundation,一个受人尊敬的组织]免费在线提供的教程 数据库来源)

下面是原始数据库的子集,对于此处的问题来说应该足够了:

名字 城市
亚历克斯 辛顿 凯里
阿玛亚 吉布森 罗利
丹尼 哈弗福德 罗利
迪克 惠特曼 罗利
丹佛 弗格森 罗利
哈姆 凯里
艾利克斯 火星 罗利
德怀恩 詹姆斯 凯里
德怀特 帕克 罗利
安德鲁 贝丁格 罗利
戴恩 劳特 罗利
安杰伊 乌耶克 罗利
艾莉莎 乌尔曼 罗利
大卫 巴雷特 罗利
阿尼萨 纳赛尔 罗利
艾弗里 凯利 罗利
德里克 麦当劳 教堂山
亚历克斯 凯里
大卫 巴雷特 罗利

我在数据库查询中得到意外结果。

我知道我做错了什么。我需要你的建议,说明我做错了什么。

第 1 部分:这有效

下面的查询按预期工作。

(更新)用简单的英语:“给我名字,姓氏,城市((名字以”a“开头,城市是”罗利“)或(名字以”d“开头,城市不是”教堂山“))”

(更新) SQL 视图中的 SQL 为:

查询:

enter image description here

结果:

enter image description here

第 2 部分:这不起作用

(更新)用简单的英语:“给我名字,姓氏,城市,其中((名字以”a“开头,城市是”罗利“)或(名字以”d“开头,城市不是”教堂山“)或(名字以”d“开头,城市不是”cary“)”

在下面的查询中,我仍然看到来自“教堂山”和“卡里”城市的结果。所以它没有按预期工作。

查询:

SELECT Customers.[First Name], Customers.[Last Name], Customers.City
FROM Customers
WHERE (((Customers.[First Name]) Like "a*") AND ((Customers.City)="raleigh")) OR (((Customers.[First Name]) Like "d*") AND (Not (Customers.City)="raleigh")) OR (((Customers.[First Name]) Like "d*") AND (Not (Customers.City)="cary"));

enter image description here

结果:

enter image description here

我在第 2 部分中做错了什么?

提前致谢。


更新:我已经明白了这个问题。“NOT”是不直观的。查询工作正常。只是我假设它不会在结果中显示“教堂山”或“卡里”。但这些出现在结果中的原因是 导致 Cary 出现,而 导致“教堂山”出现Not "chapel hill"Not "cary"

sql ms-access 布尔逻辑

评论

1赞 June7 4/26/2023
这里的大多数人不会下载文件。所有要分析问题的信息都应发布在有问题的地方。以格式化表格和/或 DDL 的形式提供示例数据。可以发布到允许附加文件的论坛并在那里提供数据库。
0赞 June7 4/26/2023
编辑问题以文本形式显示 SQL 语句。明确过滤规则。你想要在哪里:?数据中除了这 3 个城市之外还有其他城市吗?([First Name] LIKE "a*" AND City ="raleigh") OR ([First Name] LIKE "d*" AND NOT City IN("chapel hill", "cary"))
0赞 thanks_in_advance 4/26/2023
@June7关于 3 以外的城市的好问题。对于名字以“d”开头的人,只有这 3 个城市。我的 SQL 不是很好,但我在上面写了每个查询的简单英语版本。它应该澄清我在这里寻找的东西。
0赞 thanks_in_advance 4/26/2023
@June7 我添加了一个包含原始数据库的相关子集的表。这张表应该足以理解我帖子中的问题。谢谢你的建议。
0赞 June7 4/26/2023
你尝试过我建议的标准吗?切换到 SQL 视图,然后在其中键入或复制/粘贴。

答:

1赞 Andre 4/26/2023 #1

它完全按照它应该做的事情去做。
你的第 2 行和第 3 行基本上是

(LIKE d* AND NOT foo) OR (LIKE d* AND NOT bar)

使用布尔代数

Distributivity of ∧ over ∨:   x ∧ ( y ∨ z ) = ( x ∧ y ) ∨ ( x ∧ z )

这将变成:

LIKE d* AND (NOT foo OR NOT bar) =
LIKE d* AND NOT (foo AND bar) =
LIKE d* AND NOT False =
LIKE d* AND True =
LIKE d* 

因此,d* 线根本没有过滤城市。

我不确定您到底想做什么,但在 SQL 中制定可能更容易,您可以在 AND 和 OR 周围自由放置括号,而不是图形查询编辑器。

0赞 thanks_in_advance 4/27/2023 #2

我已经明白了这个问题。“NOT”对我来说是不直观的。查询工作正常。只是我假设它不会在结果中显示“教堂山”或“卡里”。但这些之所以出现在结果中,是因为 Not “chapel hill” 导致 Cary 出现,而 Not “cary” 导致 “Chapel Hill” 出现。

评论

0赞 Andre 4/27/2023
这就是我在回答中写的...... 相互抵消。所有城市都将在结果中,而不仅仅是两个城市。(a AND NOT x) OR (a AND NOT y)