2009-09-03 252 views
13

我想将此SQL查询移植到Access数据库,这在SQL Server,MySQL和Oracle上工作得很好。我怎么做? 现在它出于某种原因提示我输入了Company_ID。如何在Access中使用子查询执行更新查询?

编辑:我得到提示,因为我忘了先在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 
+0

谢谢,这帮了我很多! – 2011-08-04 14:24:10

+0

注意:如果用户是查询而不是表,并因此不可更新,则结果为“操作必须使用可更新查询”。 – 2011-12-20 22:23:47

回答

11

这可能是因为COMPANY_ID 在VendorRegKeys或用户的现有场。

编辑:

UPDATE VendorRegKeys 
INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID 
SET VendorRegKeys.Company_ID = Users.Company_ID 
+0

oops,company_ID在VendorRegKeys中不存在。但添加后,我现在得到“操作必须使用可更新的查询” – Kip 2009-09-03 18:56:06

+0

没有看到你已经编辑了一个查询作品...接受你的答案,因为它实际上工作。谢谢! – Kip 2009-09-04 02:22:15

8

你可以试试这个

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

hmm ..给出错误:查询表达式'b.company_id from vendorRegkeys a' – Kip 2009-09-03 19:16:44

+1

中的语法错误(缺少运算符)我得到它与稍微修改后的版本,在问题中更新。谢谢! – Kip 2009-09-03 19:53:32

8

直接的答案:不能。 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语法的行为也如此)。

+1

感谢所有的信息。我从来没有重视过,但管理层说我们必须支持它。 : - /至少在这种情况下,有一个可用的替代语法。 – Kip 2009-09-04 13:05:57

+0

+1“但管理层说......” – wkschwartz 2014-10-07 19:34:37