Как выполнить запрос обновления с вложенным запросом в Access?

Я хочу перенести этот 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'ы ответ:

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

3 ответов


это может быть потому, что Company_ID не существующее поле в VendorRegKeys или пользователей.

изменить:

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

прямой ответ: вы не можете. Компонент Access Database Engine simple не поддерживает синтаксис скалярных подзапросов vanilla SQL-92 даже в собственном так называемом режиме запросов ANSI-92.

вы вынуждены использовать свой собственный синтаксис, который не применяет скалярное требование, т. е. небезопасен и будет выбирать значение произвольно и молча**. Кроме того, помимо простых конструкций он вообще не работает, особенно там, где ваш подзапрос (если вам разрешили использовать его в первом place) использует функцию set (MAX, SUM и т. д.) -- см. в этой статье для некоторых действительно неудовлетворительных обходных путей.

извините за негатив, но это действительно базовый синтаксис, и я не могу понять, почему команда Access еще не удосужилась его исправить. Это бесспорная причина номер один, почему я больше не могу серьезно относиться к Access database engine.


чтобы продемонстрировать небезопасное поведение доступа proprietary 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;

при выполнении инструкции update в Access пользовательский интерфейс предупреждает нас

вы собираетесь обновить 2 строки.

несмотря на то, что в VendorRegKeys стол!

то, что происходит на практике, - это всего лишь одно из значений, которые мы будем использовать для обновления столбца в этой единственной строке без надежного способа прогнозирования.

со стандартным синтаксисом скалярного подзапроса SQL вы получит ошибку, и оператор не сможет выполнить, что, возможно, является желаемой функциональностью (стандартный SQL MERGE синтаксис ведет себя так же).


вы можете попробовать это

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