2009-09-03 39 views
13

Tôi muốn cổng truy vấn SQL này, hoạt động tốt trên SQL Server, MySQL và Oracle, đến cơ sở dữ liệu Access. Làm thế nào để làm điều đó? Ngay bây giờ nó nhắc tôi cho một Company_ID vì một lý do nào đó.Làm cách nào để tôi thực hiện truy vấn cập nhật với truy vấn phụ trong Access?

Chỉnh sửa: Tôi đã nhận được lời nhắc vì trước tiên tôi đã quên tạo cột Company_ID trong VendorRegKeys. Bây giờ tôi nhận được lỗi "Hoạt động phải sử dụng một truy vấn updateable".

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

Cập nhật: Tôi thấy điều này để làm việc dựa trên câu trả lời JuniorFlip 's:

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

Cảm ơn, điều này đã giúp tôi rất nhiều! –

+0

Lưu ý: Nếu Người dùng là Truy vấn trái ngược với Bảng và do đó không thể cập nhật, kết quả là "Hoạt động phải sử dụng truy vấn có thể cập nhật". –

Trả lời

11

Đó có thể là do company_id không phải là một lĩnh vực đang tồn tại trong VendorRegKeys HOẶC Users.

EDIT:

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

oops, company_ID không tồn tại trong VendorRegKeys. Nhưng sau khi thêm nó, bây giờ tôi nhận được "Hoạt động phải sử dụng truy vấn có thể cập nhật" – Kip

+0

không thấy rằng bạn đã chỉnh sửa trong truy vấn hoạt động ... chấp nhận câu trả lời của bạn vì nó thực sự hoạt động. cảm ơn! – Kip

8

bạn có thể thử một

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

hmm .. cung cấp lỗi: Lỗi cú pháp (toán tử bị thiếu) trong biểu thức truy vấn 'b.company_id từ vendorRegkeys a' – Kip

+1

tôi đã làm việc với phiên bản được sửa đổi một chút về điều này, được cập nhật trong câu hỏi. cảm ơn! – Kip

8

câu trả lời Straight này: bạn không thể. Cơ sở dữ liệu Access Engine đơn giản không hỗ trợ cú pháp truy vấn con vectơ SQL-92 vani ngay cả khi nó được gọi là chế độ truy vấn ANSI-92 của nó.

Bạn buộc phải sử dụng cú pháp độc quyền của riêng nó mà không thực thi yêu cầu vô hướng tức là không an toàn và sẽ chọn giá trị tùy ý và âm thầm **. Hơn nữa, ngoài các cấu trúc đơn giản, nó không hoạt động chút nào, đáng chú ý nhất là truy vấn phụ của bạn (nếu bạn được phép sử dụng một ở vị trí đầu tiên) sử dụng một hàm được đặt (MAX, SUM, v.v.) - xem this article cho một số cách giải quyết thực sự không đạt yêu cầu .

Xin lỗi là tiêu cực nhưng đây thực sự là cú pháp cơ bản và tôi không thể hiểu tại sao nhóm Access vẫn chưa sửa đổi. Đó là lý do không thể tranh cãi số một lý do tại sao tôi không thể lấy cơ sở dữ liệu truy cập nghiêm túc nữa.


Để chứng minh các hành vi không an toàn của Access độc quyền UPDATE..JOIN..Set cú pháp

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; 

Khi thực hiện báo cáo cập nhật trong Access, giao diện người dùng cảnh báo chúng tôi

You are about to update 2 row(s).

mặc dù thực tế chỉ có một hàng trong bảng VendorRegKeys!

Điều gì xảy ra trong thực tế chỉ là một trong các giá trị mà chúng tôi sẽ sử dụng để cập nhật cột trong hàng đơn đó mà không có cách nào đáng tin cậy để dự đoán nó sẽ là gì.

Với cú pháp truy vấn con số vô hướng của SQL chuẩn, bạn sẽ gặp lỗi và câu lệnh sẽ không thực hiện được, được cho là chức năng mong muốn (cú pháp MERGE của SQL tiêu chuẩn cũng hoạt động theo cách này).

+1

cảm ơn tất cả thông tin. Tôi chưa bao giờ truy cập nghiêm túc, nhưng quản lý nói rằng chúng tôi phải hỗ trợ nó. : -/Ít nhất trong trường hợp này, có một cú pháp thay thế hoạt động. – Kip

+0

+1 cho "nhưng quản lý nói ..." – wkschwartz

Các vấn đề liên quan