2009-09-03 112 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