提问人:thanks_in_advance 提问时间:4/26/2023 最后编辑:thanks_in_advance 更新时间:4/29/2023 访问量:62
MS Access 查询产生意外结果(图示)
MS Access query producing an unexpected result (illustrated)
问:
(免责声明:本数据库中没有真实姓名。数据库来自GCF [Goodwill Community Foundation,一个受人尊敬的组织]免费在线提供的教程 数据库来源)
下面是原始数据库的子集,对于此处的问题来说应该足够了:
名字 | 姓 | 城市 |
---|---|---|
亚历克斯 | 辛顿 | 凯里 |
阿玛亚 | 吉布森 | 罗利 |
丹尼 | 哈弗福德 | 罗利 |
迪克 | 惠特曼 | 罗利 |
丹佛 | 弗格森 | 罗利 |
唐 | 哈姆 | 凯里 |
艾利克斯 | 火星 | 罗利 |
德怀恩 | 詹姆斯 | 凯里 |
德怀特 | 帕克 | 罗利 |
安德鲁 | 贝丁格 | 罗利 |
戴恩 | 劳特 | 罗利 |
安杰伊 | 乌耶克 | 罗利 |
艾莉莎 | 乌尔曼 | 罗利 |
大卫 | 巴雷特 | 罗利 |
阿尼萨 | 纳赛尔 | 罗利 |
艾弗里 | 凯利 | 罗利 |
德里克 | 麦当劳 | 教堂山 |
亚历克斯 | 袁 | 凯里 |
大卫 | 巴雷特 | 罗利 |
我在数据库查询中得到意外结果。
我知道我做错了什么。我需要你的建议,说明我做错了什么。
第 1 部分:这有效
下面的查询按预期工作。
(更新)用简单的英语:“给我名字,姓氏,城市((名字以”a“开头,城市是”罗利“)或(名字以”d“开头,城市不是”教堂山“))”
(更新) SQL 视图中的 SQL 为:
查询:
结果:
第 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"));
结果:
我在第 2 部分中做错了什么?
提前致谢。
更新:我已经明白了这个问题。“NOT”是不直观的。查询工作正常。只是我假设它不会在结果中显示“教堂山”或“卡里”。但这些出现在结果中的原因是 导致 Cary 出现,而 导致“教堂山”出现Not "chapel hill"
Not "cary"
答:
它完全按照它应该做的事情去做。
你的第 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 周围自由放置括号,而不是图形查询编辑器。
我已经明白了这个问题。“NOT”对我来说是不直观的。查询工作正常。只是我假设它不会在结果中显示“教堂山”或“卡里”。但这些之所以出现在结果中,是因为 Not “chapel hill” 导致 Cary 出现,而 Not “cary” 导致 “Chapel Hill” 出现。
评论
(a AND NOT x) OR (a AND NOT y)
评论
([First Name] LIKE "a*" AND City ="raleigh") OR ([First Name] LIKE "d*" AND NOT City IN("chapel hill", "cary"))