Sql 如何使用Access中的子查询执行更新查询?

Sql 如何使用Access中的子查询执行更新查询?,sql,ms-access,syntax,subquery,Sql,Ms Access,Syntax,Subquery,我想将这个SQL查询(在SQL Server、MySQL和Oracle上运行良好)移植到Access数据库。我该怎么做?现在它出于某种原因提示我输入公司ID 编辑:我收到提示,因为我忘了首先在VendorRegKeys中创建Company\u ID列。现在我得到错误“操作必须使用可更新的查询” 更新:我发现根据的答案,这是可行的: UPDATE VendorRegKeys, Users SET VendorRegKeys.Company_ID = Users.Company_ID WHERE

我想将这个SQL查询(在SQL Server、MySQL和Oracle上运行良好)移植到Access数据库。我该怎么做?现在它出于某种原因提示我输入公司ID

编辑:我收到提示,因为我忘了首先在VendorRegKeys中创建Company\u ID列。现在我得到错误“操作必须使用可更新的查询”


更新:我发现根据的答案,这是可行的:

UPDATE VendorRegKeys, Users
SET VendorRegKeys.Company_ID = Users.Company_ID
WHERE VendorRegKeys.CreatedBy_ID = Users.User_ID

这可能是因为Company_ID不是vendorregkey或Users中的现有字段

编辑:

UPDATE VendorRegKeys
INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID
SET VendorRegKeys.Company_ID = Users.Company_ID
你可以试试这个

update a
set a.company_id = b.company_id
from vendorRegkeys a, users b
where a.createdby_id = b.user_id

直截了当的回答:你不能。Access数据库引擎simple不支持普通SQL-92标量子查询语法,即使在其自己所谓的ANSI-92查询模式下也是如此

您被迫使用其自己的专有语法,该语法不强制执行标量要求,即不安全,并且将任意、无声地选取值**。此外,除了简单的构造之外,它根本不起作用,尤其是在子查询(如果允许您首先使用一个)使用set函数的情况下(
MAX
SUM
,等等)——请参阅一些真正不令人满意的解决方法

很抱歉是否定的,但这是非常基本的语法,我不明白为什么Access团队还没有着手解决它。这是我不能再认真对待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中执行update语句时,UI警告我们

您将要更新2行

尽管事实上,
VendorRegKeys
表中只有一行

实际上发生的只是我们将用于更新该行中的列的值之一,没有可靠的方法来预测它将是哪个


使用标准SQL的标量子查询语法,您将得到一个错误,并且语句将无法执行,这可以说是所需的功能(标准SQL的
MERGE
语法也以这种方式运行)。

oops,company\u ID在VendorRegKeys中不存在。但在添加它之后,我现在得到“操作必须使用可更新查询”并没有看到您在一个有效的查询中进行了编辑。。。接受你的答案,因为它确实有效。谢谢隐马尔可夫模型。。这就产生了错误:查询表达式“b.company\u id from vendorRegkeys a”中的语法错误(缺少运算符),我得到了一个稍微修改的版本,在问题中进行了更新。谢谢谢谢你提供的所有信息。我从未认真对待过访问,但管理层表示,无论如何,我们都必须支持访问至少在这种情况下,有一种替代语法可以工作。谢谢,这对我帮助很大!注意:如果用户是查询而不是表,因此不可更新,则结果是“操作必须使用可更新的查询”。
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;