MS Access:WHERE-EXISTS-clause 不适用于视图?
Posted
技术标签:
【中文标题】MS Access:WHERE-EXISTS-clause 不适用于视图?【英文标题】:MS Access: WHERE-EXISTS-clause not working on views? 【发布时间】:2012-02-23 04:51:13 【问题描述】:先决条件:在 MS Access 2010 中创建以下表格:
CREATE TABLE ATBL(ID INT);
INSERT INTO ATBL(ID) VALUES (1);
INSERT INTO ATBL(ID) VALUES (2);
INSERT INTO ATBL(ID) VALUES (3);
CREATE TABLE BTBL(ID INT);
INSERT INTO BTBL(ID) VALUES (1);
INSERT INTO BTBL(ID) VALUES (2);
同时创建一个名为 BVIEW 的视图,它使用以下 SELECT 语句:
SELECT A.ID FROM ATBL AS A WHERE A.ID = 1 OR A.ID = 2
现在 BVIEW 应该与 BTBL 具有相同的内容。然而,以下两个查询将返回不同的结果:
SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM BTBL AS B WHERE B.ID=A.ID)
SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM BVIEW AS B WHERE B.ID=A.ID)
第一个查询返回两条记录(1 和 2),但第二个查询返回来自 ATBL 的所有记录。这里有什么问题?我错过了什么吗?
【问题讨论】:
FWIW 您的代码在 SQL Server 上按预期工作。 【参考方案1】:视图实际上是一个保存的 SQL SELECT 语句。至少,这是 MS Access 中保存的视图。并且您使用相同的内部变量 A 和 B。恕我直言,它们混合在一起。最后一行真的看起来像
SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM (SELECT A.ID FROM ATBL AS A WHERE A.ID = 1 OR A.ID = 2) AS B WHERE B.ID=A.ID)
尝试更改一些内部名称,例如:
SELECT AA.ID FROM ATBL AS AA WHERE AA.ID = 1 OR AA.ID = 2
所以,最后一行看起来像
SELECT A.ID FROM ATBL AS A WHERE EXISTS (SELECT 1 FROM (SELECT AA.ID FROM ATBL AS AA WHERE AA.ID = 1 OR AA.ID = 2) AS B WHERE B.ID=A.ID)
所以,正如我们在这里看到的,MS Access 甚至不知道如何隔离别名!
【讨论】:
好吧,我第一次弄错了,现在我看到了你的SQL,我明白你的意思了。它现在正在工作。感谢您澄清这种行为! 真的很可怕,不是吗? MS Access 甚至不知道隔离内部变量! +1 需要明确的是,这必须被视为 Access 数据库引擎的一个错误,一个修复的可能性微乎其微,而且通常的借口是客户可能依赖(损坏的) 行为(重要的是要记住 Access 数据库引擎最重要的客户是 Windows 团队!) @onedaywhen 并且 MS Access 的错误比 Excel 少得多,而 Excel 的错误比 Word 少得多。我用 Word 编程了一年——这几乎是不可能的!以上是关于MS Access:WHERE-EXISTS-clause 不适用于视图?的主要内容,如果未能解决你的问题,请参考以下文章
MS ACCESS, VBA 将外部 MS Access 表导入 SQL server 表
MS Access:突出显示 MS Access 报告中的特定字段
MS access 使用相对路径查询多个 MS Access 数据库
连接 MS Access 而另一个应用程序使用相同的 MS Access 文件