別のテーブルから抽出されたテーブルレコードに INSERT を実行する方法
質問
テーブルからデータを抽出して変換し、それらのデータを別のテーブルに挿入するクエリを作成しようとしています。はい、これはデータ ウェアハウジング クエリであり、MS Access で実行しています。したがって、基本的には次のようなクエリが必要です。
INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
(SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);
試してみましたが、構文エラーのメッセージが表示されました。
これをやりたい場合はどうしますか?
解決
「VALUES」も括弧もありません:
INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
他のヒント
構文オプションは 2 つあります。
オプション1
CREATE TABLE Table1 (
id int identity(1, 1) not null,
LongIntColumn1 int,
CurrencyColumn money
)
CREATE TABLE Table2 (
id int identity(1, 1) not null,
LongIntColumn2 int,
CurrencyColumn2 money
)
INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)
INSERT INTO Table2
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1
オプション 2
CREATE TABLE Table1 (
id int identity(1, 1) not null,
LongIntColumn1 int,
CurrencyColumn money
)
INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1
INTO Table2
FROM Table1
GROUP BY LongIntColumn1
オプション 2 では、プロジェクション上の列 (SELECT 上の列) のみを含むテーブルが作成されることに注意してください。
VALUES と括弧の両方を削除します。
INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
取り除く VALUES
SQLから。
この場合の問題は「値」キーワードだと思います。データを 1 行のみ挿入する場合は、「values」キーワードを使用します。選択の結果を挿入する場合は必要ありません。
また、実際には、select ステートメントを括弧で囲む必要はありません。
から msdn:
複数レコードの追加クエリ:
INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression
単一レコード追加クエリ:
INSERT INTO target [(field1[, field2[, …]])]
VALUES (value1[, value2[, …])
行のグループを追加する場合は「値」を削除し、余分な括弧を削除します。(例で行ったように) avg(CurrencyColumn) のエイリアスを使用するか、エイリアスをまったく使用しないことによって、循環参照を回避できます。
両方のテーブルの列名が同じ場合、クエリは次のようになります。
INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn) as CurrencyColumn1
FROM Table1
GROUP BY LongIntColumn;
そして、エイリアスなしでも機能します。
INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;
そうですね、最良の方法は、2 つのレコードセットを定義し、それらを 2 つのテーブル間の中間として使用することだと思います (そうなるでしょうか?)。
- 両方のレコードセットを開きます
- 最初のテーブルからデータを抽出します (SELECT blablabla)
- 最初のレコードセットで利用可能なデータで 2 番目のレコードセットを更新します (新しいレコードを追加するか、既存のレコードを更新します)
- 両方のレコードセットを閉じます
この方法は、異なるデータベースからテーブルを更新する予定がある場合に特に興味深いです (つまり、各レコードセットは独自の接続を持つことができます)。
あるテーブルから別のデータベースの別のテーブルにデータを挿入する
insert into DocTypeGroup
Select DocGrp_Id,DocGrp_SubId,DocGrp_GroupName,DocGrp_PM,DocGrp_DocType
from Opendatasource( 'SQLOLEDB','Data Source=10.132.20.19;UserID=sa;Password=gchaturthi').dbIPFMCI.dbo.DocTypeGroup
既存のテーブルに抽出を挿入しますか?
それが問題でなければ、以下のクエリを試してみてください。
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1
GROUP BY LongIntColumn1);
抽出された情報を含む新しいテーブル -> T1 が作成されます。