正解:できません。Access Database Engine Simpleは、独自のいわゆるANSI-92クエリモードの場合でも、バニラSQL-92スカラーサブクエリ構文をサポートしていません。
スカラー要件を強制しない独自の構文を使用する必要があります。つまり、安全ではなく、任意にサイレントに値を選択します**。さらに、単純な構造を超えて、それはまったく機能しません。特に、サブクエリ(最初に使用が許可されている場合)が集合関数(MAX
、SUM
など)を使用する場合-いくつかの本当に不十分な回避策については、この記事を参照してください。
否定的に申し訳ありませんが、これは本当に基本的な構文であり、Accessチームがまだ修正に取り掛かっていない理由がわかりません。これが、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内でupdateステートメントを実行すると、UIは警告を表示します
2行を更新しようとしています。
VendorRegKeys
テーブルには1行しかないという事実にもかかわらず!
実際に発生するのは、その単一行の列を更新するために使用する値の1つにすぎず、どの値になるかを確実に予測する方法はありません。
標準SQLのスカラーサブクエリ構文を使用すると、エラーが発生し、ステートメントの実行に失敗します。これは、おそらく望ましい機能です(標準SQLのMERGE
構文もこのように動作します)。