sql - 微软 Access : WHERE-EXISTS-clause not working on views?

标签 sql database ms-access select sql-view

先决条件:在 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 的 View ,它使用以下 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 中的所有记录。这里出了什么问题?我错过了什么吗?

最佳答案

View 实际上是一个保存的 SQL SELECT 语句。至少,这是 MS Access 中保存的 View 。并且您使用相同的内部变量 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 - 微软 Access : WHERE-EXISTS-clause not working on views?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9080052/

相关文章:

mysql - SQL查询最后连续相同的数据

sql - oracle distinct 做排序

mysql - 在 MySQL 备份期间 INSERT 会发生什么?

database - 无法在 postgresql 上创建 RLS

python - 使用 pyodbc 和 pandas 将 CSV 加载到 .mdb

sql - ActiveRecord 的意外行为包括

mysql - 意外操作数应包含 1 列错误

database - 使用存储过程做insert/update/delete/select有什么好处?

mysql - 数据宏 - MySql 后端

vba - 解析字符串VBA