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
これは、Company_ID そうではない VendorRegKeys ORユーザー)の既存のフィールドが原因である可能性があります。
編集:
UPDATE VendorRegKeys
INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID
SET VendorRegKeys.Company_ID = Users.Company_ID
正解:できません。 Access Database Engine simpleは、独自のいわゆるANSI-92クエリモードの場合でも、VanillaSQL-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内で更新ステートメントを実行すると、UIは警告を表示します
2行を更新しようとしています。
VendorRegKeys
テーブルには1行しかないという事実にもかかわらず!
実際に発生するのは、その単一行の列を更新するために使用する値の1つにすぎず、信頼できる方法で列を予測することはできません。
標準SQLのスカラーサブクエリ構文を使用すると、エラーが発生し、ステートメントの実行に失敗します。これは、おそらく望ましい機能です(標準SQLのMERGE
構文もこのように動作します)。
あなたはこれを試すことができます
update a
set a.company_id = b.company_id
from vendorRegkeys a, users b
where a.createdby_id = b.user_id