直接回答:你不能。即使在其自己的所谓 ANSI-92 查询模式下,Access 数据库引擎 simple 也不支持 vanilla SQL-92 标量子查询语法。
您被迫使用它自己的专有语法,它不强制执行标量要求,即不安全,并且会任意且无声地选择一个值**。此外,除了简单的构造之外,它根本不起作用,最值得注意的是您的子查询(如果您一开始就被允许使用一个)使用集合函数(MAX
,SUM
等) - 请参阅本文了解一些非常不令人满意的解决方法。
很抱歉否定,但这确实是基本语法,我不明白为什么 Access 团队还没有解决它。这是我不能再认真对待 Access 数据库引擎的无可争议的第一大原因。
UPDATE..JOIN..Set
演示 Access 专有语法的不安全行为
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 会警告我们
您即将更新 2 行。
尽管事实上表格中只有一行VendorRegKeys
!
在实践中发生的只是我们将用于更新该单行中的列的值之一,而没有可靠的方法来预测它将是哪个。
使用标准 SQL 的标量子查询语法,您会收到错误并且语句将无法执行,这可以说是所需的功能(标准 SQL 的MERGE
语法也是如此)。