Прямой ответ: нельзя. Простое ядро базы данных Access не поддерживает стандартный синтаксис скалярного подзапроса SQL-92, даже если он находится в собственном так называемом режиме запросов ANSI-92.
Вы вынуждены использовать собственный проприетарный синтаксис, который не обеспечивает скалярное требование, т. е. небезопасен и будет выбирать значение произвольно и молча**. Кроме того, помимо простых конструкций, он вообще не работает, особенно там, где ваш подзапрос (если вам было разрешено использовать его в первую очередь) использует функцию набора (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 вы получите ошибку, и оператор не сможет выполниться, что, возможно, является желаемой функциональностью (так же ведет себя и синтаксис MERGE
стандартного SQL).
person
onedaywhen
schedule
04.09.2009