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 文件

将 MS Access 用作 Winform 或 WPF 的后端时如何避免损坏 MS Access

如何让 ms-access 以其他用户身份连接到 ms-sql?