2

私は SQL の初心者で、複数のテーブル エントリを 1 つの SQL ステートメントに挿入する方法を理解しようとしています。これが私のコードです:

INSERT INTO [Students](P_Id,FirstName,LastName,class,city,Phone)
SELECT 123,'Avi','Davis',2,'Tel-Mond','03-456789'
UNION
SELECT 234, 'Dani',2,'Dimona',' 02-111'
UNION 
SELECT 345,'Itzik',3,'Ariel', '03-2222'
UNION 
SELECT456, 'Koby', 3, 'Tel-Aviv', '03-333333'
UNION 
SELECT 789,'Moshe' ,2 , 'Tel-Aviv','03-7777777'

さまざまなチュートリアルの「ヘルプ」を使用して、テーマのあらゆる種類のバリエーションを試しましたが、これまで試したことはありません。異なる DB プログラムごとに、SQL の使用法がわずかに異なるようです。

MS Access で動作するようにコードを変更する方法について何か提案はありますか?

4

3 に答える 3

1

今日、アプリケーションのパフォーマンスを向上させるために複数行の挿入アプローチを試しましたが、顕著な改善が得られなかったため、ここでの回答を拡張したいと思いました。

上記のRemouと同様のアプローチを使用して機能させましたが、おそらくUNION ALLが必要でした。そうしないと、UNIONには暗黙の明確な区別があり、エイリアス化された外部選択が必要なように見えたため、2つの同一の行が挿入されません。さらに、上記のように結合すると、Access で from テーブルが必要になるため、Oracle の規則に従い、DUAL という単一行テーブルを作成しました。

INSERT INTO [Students](P_Id,FirstName, LastName, class,  city,Phone)
SELECT * FROM
(
 SELECT 123 As P_ID, 'Avi' As FirstName, 'Davis' As LastName, 2 As Class,
        'Tel-Mond' As City,'03-456789' As Phone FROM DUAL
UNION ALL
 SELECT 456 As P_ID, 'FDA' As FirstName, 'RET' As LastName, 3 As Class,
        'lima' As City,'03-456789' As Phone FROM DUAL
.
.
.
.
) as MyAlias

私の例では、よりシンプルにして、varchar(50) 列を持つ単一列テーブルを作成しました。これを 1000 行で試したところ、Access は「クエリが複雑すぎる」と不平を言いました。正常に挿入するには、49 行に減らす必要がありました。これは、Access がそれを受け入れるために、挿入を小さなチャンクにまとめる必要があることを示唆しています。

その結果、パフォーマンスは向上しませんでした。手間をかける価値はなく、コードでバッチアップロジックが必要になるため、パフォーマンスの向上のために他の場所を探すことになります。

于 2011-09-27T15:45:55.937 に答える
1

MS Access でそのようなことを行うことができますが、from テーブルが必要であり、1 行だけが返されるように注意する必要があります。

INSERT INTO [Students](P_Id,FirstName, LastName, class,  city,Phone)
SELECT 123 As P_ID, 'Avi' As FirstName, 'Davis' As LastName, 2 As Class,
        'Tel-Mond' As City,'03-456789' As Phone FROM AnyTable
UNION
<...>

VBA とループを使用する方が簡単です。

于 2010-08-18T16:49:52.123 に答える
0

Access は、クエリで 1 つの SQL ステートメントのみを実行します。通常、Access では、csv ファイルまたはスプレッドシートからデータを読み込みます。本当にSQLでやりたい場合は、ほとんどのデータベースに接続し(Accessで試したことはありません)、スクリプトを実行するiSQLviewerのようなクライアントを入手してください。

于 2010-08-18T22:44:45.847 に答える