16

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

编辑:我收到提示是因为我忘记首先在 VendorRegKeys 中创建 Company_ID 列。现在我收到错误“操作必须使用可更新查询”。

UPDATE VendorRegKeys
   SET Company_ID = (SELECT Users.Company_ID
                     FROM Users
                     WHERE Users.User_ID = VendorRegKeys.CreatedBy_ID)

更新:我发现这是基于JuniorFlip的回答:

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

3 回答 3

15

直接回答:你不能。即使在其自己的所谓 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语法也是如此)。

于 2009-09-04T10:14:31.777 回答
14

这可能是因为 Company_ID不是VendorRegKeys OR Users 中的现有字段。

编辑:

UPDATE VendorRegKeys
INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID
SET VendorRegKeys.Company_ID = Users.Company_ID
于 2009-09-03T18:51:28.807 回答
8

你可以试试这个

update a
set a.company_id = b.company_id
from vendorRegkeys a, users b
where a.createdby_id = b.user_id
于 2009-09-03T19:07:36.570 回答