直接的答案:不能。 Access数据库引擎简单地不支持vanilla SQL-92标量子查询语法,即使在它自己的所谓ANSI-92查询模式下。
您不得不使用自己的专有语法,它不强制执行标量要求,即不安全,并会随意选择一个值并默默**。此外,除了简单的结构之外,它根本不起作用,最显着的是你的子查询(如果你被允许首先使用一个)使用set函数(MAX
,SUM
等) - 请参阅this article以获得一些非常令人不满意的解决方法。
对不起,但这是真正的基本语法,我不明白为什么Access团队还没有得到解决它。这是我无法认真考虑Access数据库引擎的无可争议的头号原因。
为了证明访问专有UPDATE..JOIN..Set
语法
CREATE TABLE Users
(
User_ID CHAR(3) NOT NULL,
Company_ID CHAR(4) NOT NULL,
UNIQUE (Company_ID, User_ID));
CREATE TABLE VendorRegKeys
CreatedBy_ID CHAR(3) NOT NULL UNIQUE,
Company_ID CHAR(4));
INSERT INTO Users VALUES ('Kip', 'MSFT');
INSERT INTO Users VALUES ('Kip', 'AAPL');
INSERT INTO VendorRegKeys VALUES ('Kip', NULL);
UPDATE VendorRegKeys
INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID
SET VendorRegKeys.Company_ID = Users.Company_ID;
在Access中执行更新语句,该UI警告我们
You are about to update 2 row(s).
尽管事实上的不安全行为,只有在VendorRegKeys
表中有一排!
在实践中发生的情况只是我们用来更新该行中列的值之一,没有一个可靠的方法来预测它会是什么。
使用标准SQL的标量子查询语法,您将收到一个错误,并且该语句将无法执行,这可以说是所需的功能(标准SQL的MERGE
语法的行为也如此)。
谢谢,这帮了我很多! – 2011-08-04 14:24:10
注意:如果用户是查询而不是表,并因此不可更新,则结果为“操作必须使用可更新查询”。 – 2011-12-20 22:23:47