web-dev-qa-db-ja.com

Accessでサブクエリを使用して更新クエリを実行するにはどうすればよいですか?

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)

Update:これは JuniorFlip の答えに基づいて機能することがわかりました:

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

これは、Company_ID そうではない VendorRegKeys ORユーザー)の既存のフィールドが原因である可能性があります。

編集:

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

正解:できません。 Access Database Engine simpleは、独自のいわゆるANSI-92クエリモードの場合でも、VanillaSQL-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内で更新ステートメントを実行すると、UIは警告を表示します

2行を更新しようとしています。

VendorRegKeysテーブルには1行しかないという事実にもかかわらず!

実際に発生するのは、その単一行の列を更新するために使用する値の1つにすぎず、信頼できる方法で列を予測することはできません。

標準SQLのスカラーサブクエリ構文を使用すると、エラーが発生し、ステートメントの実行に失敗します。これは、おそらく望ましい機能です(標準SQLのMERGE構文もこのように動作します)。

14
onedaywhen

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

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