16

SQL Server、MySQL、および Oracle で問題なく動作するこの SQL クエリを Access データベースに移植したいと考えています。それ、どうやったら出来るの? 現在、何らかの理由で Company_ID の入力を求められています。

編集: VendorRegKeys に Company_ID 列を最初に作成するのを忘れたため、プロンプトが表示されました。「操作は更新可能なクエリを使用する必要があります」というエラーが表示されます。

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
4

3 に答える 3

15

正解:できません。Access Database Engine Simpleは、独自のいわゆるANSI-92クエリモードの場合でも、バニラSQL-92スカラーサブクエリ構文をサポートしていません。

スカラー要件を強制しない独自の構文を使用する必要があります。つまり、安全ではなく、任意にサイレントに値を選択します**。さらに、単純な構造を超えて、それはまったく機能しません。特に、サブクエリ(最初に使用が許可されている場合)が集合関数(MAXSUMなど)を使用する場合-いくつかの本当に不十分な回避策については、この記事を参照してください。

否定的に申し訳ありませんが、これは本当に基本的な構文であり、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構文もこのように動作します)。

于 2009-09-04T10:14:31.777 に答える
14

これは、Company_IDがVendorRegKeysまたはUsersの既存のフィールドではないことが原因である可能性があります。

編集:

UPDATE VendorRegKeys
INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID
SET VendorRegKeys.Company_ID = Users.Company_ID
于 2009-09-03T18:51:28.807 に答える
8

あなたはこれを試すことができます

update a
set a.company_id = b.company_id
from vendorRegkeys a, users b
where a.createdby_id = b.user_id
于 2009-09-03T19:07:36.570 に答える