184

テーブルからデータを抽出して変換し、それらのデータを別のテーブルに挿入するクエリを作成しようとしています。はい、これはデータ ウェアハウス クエリであり、MS Access で実行しています。したがって、基本的には次のようなクエリが必要です。

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
  (SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);

試してみましたが、構文エラー メッセージが表示されます。

これをやりたいと思ったらどうしますか?

4

9 に答える 9

291

「値」なし、括弧なし:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
于 2008-09-16T16:23:34.010 に答える
29

次の 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 の列) のみを含むテーブルが作成されることに注意してください。

于 2008-09-16T16:25:51.773 に答える
25

VALUES と括弧の両方を削除します。

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
于 2008-09-16T16:24:34.850 に答える
11

この場合の問題は「values」キーワードだと思います。データを 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[, …])
于 2008-09-16T16:27:46.027 に答える
10

VALUESSQLから削除します。

于 2008-09-16T16:23:01.953 に答える
4

行のグループを追加するときは「値」を削除し、余分な括弧を削除します。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;
于 2008-09-16T16:40:58.930 に答える
2

2 つのレコードセットを定義し、それらを 2 つのテーブルの中間として使用するのが最善の方法だと思います (そうなるでしょうか?)。

  1. 両方のレコードセットを開く
  2. 最初のテーブルからデータを抽出します (SELECT blablabla)
  3. 最初のレコードセットで使用可能なデータで 2 番目のレコードセットを更新します (新しいレコードを追加するか、既存のレコードを更新します)。
  4. 両方のレコードセットを閉じる

この方法は、異なるデータベースからテーブルを更新する予定がある場合に特に興味深いものです (つまり、各レコードセットは独自の接続を持つことができます...)。

于 2008-09-16T16:27:05.763 に答える
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
于 2008-12-08T09:19:36.503 に答える
1

既存のテーブルに抽出を挿入しますか?

問題がない場合は、次のクエリを試すことができます。

SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1 
GROUP BY LongIntColumn1);

抽出された情報を使用して新しいテーブルを作成します-> T1

于 2008-09-16T16:34:27.197 に答える