Ответ 1
Это может быть связано с тем, что Company_ID не существующее поле в VendorRegKeys OR Users.
ИЗМЕНИТЬ:
UPDATE VendorRegKeys
INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID
SET VendorRegKeys.Company_ID = Users.Company_ID
Я хочу передать этот SQL-запрос, который отлично работает на SQL Server, MySQL и Oracle, в базу данных Access. Как мне это сделать? В настоящее время по какой-то причине он запрашивает у меня идентификатор Company_ID.
Изменить. Я получил приглашение, потому что забыл сначала создать столбец Company_ID в VendorRegKeys. Теперь я получаю сообщение об ошибке "Операция должна использовать обновляемый запрос".
UPDATE VendorRegKeys
SET Company_ID = (SELECT Users.Company_ID
FROM Users
WHERE Users.User_ID = VendorRegKeys.CreatedBy_ID)
Обновление. Я нашел, что это работает на основе JuniorFlip answer:
UPDATE VendorRegKeys, Users
SET VendorRegKeys.Company_ID = Users.Company_ID
WHERE VendorRegKeys.CreatedBy_ID = Users.User_ID
Это может быть связано с тем, что Company_ID не существующее поле в VendorRegKeys OR 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
Прямой ответ: вы не можете. Простой механизм доступа к базе данных не поддерживает синтаксис скалярного подзапроса валиний SQL-92, даже если он находится в собственном так называемом режиме запросов ANSI-92.
Вы вынуждены использовать собственный собственный синтаксис, который не применяет скалярное требование, то есть небезопасно и будет выбирать значение произвольно и молча **. Кроме того, помимо простых конструкций это вообще не работает, особенно в том случае, когда ваш подзапрос (если вам разрешено использовать его в первую очередь) использует функцию set (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 пользовательский интерфейс предупреждает нас, что
Вы собираетесь обновить 2 строки.
несмотря на то, что в таблице VendorRegKeys
есть только одна строка!
То, что происходит на практике, - это только одно из значений, которые мы будем использовать для обновления столбца в этой отдельной строке без надежного способа предсказать, какой он будет.
С синтаксисом стандартного SQL-подзадачи SQL вы получите ошибку, и оператор не сможет выполнить, что, возможно, является желаемой функциональностью (синтаксис Standard SQL MERGE
тоже ведет себя так).