2016-09-14 8 views
0

フィールドである場合、私は二つに構造化されたデータの膨大な量を持っているが、次の列を持つシートをエクセル:VBA - 2つの表に挿入最初のテーブルからIDを第二

EXCEL DATA 

Sheet1 [pod, client, address, ...etc] -one record per [pod] 
Sheet2 [pod, pointofmeasure, typepct, ...etc] -one-to-many records per [pod] 

-relationshipはsheet1.pod の間であります

sheet2.pod(1対多リレーションシップ)

Iは、以下の表構造でAccessデータベースにその優れたシートからデータを挿入するSQLを必要

where table2.pod_id = table1.id

1つのSQLインサートで実行できますか?

私は今、地獄は、私がtable2のにデータを挿入するためにidを取得する方法...この大量の挿入で

cn.Open scn 
ssql = "INSERT INTO table1 (pod, client, address, ...etc) " 
ssql = ssql & "SELECT * FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "].[sheet1$]" 

cn.Execute ssql, cAffectedRows 
cn.Close 

を思いつきましたか?

+0

元のデータに** id **、** pod **、** pod_id **の間には関係がありませんので、** no **とすることはできません。 [mcve]を参照してください。 – Jeeped

+0

** _sheet1_のpod **には一意の値が含まれており、_sheet2_には最初のシートから** pod **にリンクされた複数のレコードが含まれています - 関係は** pod.sheet1 **と** pod.sheet2 **(one-to -many) – Adrian

+0

http://stackoverflow.com/questions/595132/how-to-get-id-of-newly-inserted-record-using-excel-vba?rq=1をご覧ください。わからない、そのアクセスは@@ Identityをサポートしています。多分この質問はあなたを少し助けますか? – swe

答えて

0

表1のPod-Columnが一意であると仮定すると、条件SELECT id FROM table1 WHERE pod = 'myCurrentPod'を挿入し、再度IDを選択する必要があります。

ポッドが一意ではなく、他の既知の値を持つポッドも一意でない場合、そのようにする機会はありません。 他の既知の値を持つポッドが一意である場合は、上位条件をさらに条件を展開することができます。

すべてのケースでは、一括挿入はできませんが、シート1から1行挿入し、シート2からリンクされた行を挿入し、次のシート1行などを挿入します。

テーブルを設計できる場合は、自動インクリメントIDは使用しないでくださいが、アプリケーションセットIDを使用してください。または、ポッドの値が本当にユニークであれば、これをpkとして使用します。

+0

hmm ... ** pod ** from table1はユニークではなく、異なるセッション(Excelシートからのインポート)の同じ**ポッド**の複数のレコードが存在する可能性があります。そのため、フィールドを追加した理由** pod_id * *アクセスの関係を作り、何を意味するのか知っていればPODの履歴を残す – Adrian

+0

** pod **はExcel 1からユニークです – Adrian

+0

@Adrian私の回答を編集 – swe

0

列の名前が正しく(つまり、各属性がスキーマ全体で一意かつ一貫して名前が付けられている)、外部キーが期待どおりに設定されている場合は、1つの挿入で行うことができます。あなたは、ビュー経由で挿入した場合ので、それを許可する(ID列を省略し、

CREATE TABLE TableA 
(ID IDENTITY NOT NULL UNIQUE, 
    a_col INTEGER NOT NULL); 

CREATE TABLE TableB 
(ID INTEGER NOT NULL UNIQUE 
    REFERENCES TableA (ID), 
    b_col INTEGER NOT NULL); 

CREATE VIEW TestAB 
(a_ID, a_col, b_ID, b_col) AS 
SELECT A1.ID, A1.a_col, B1.ID, B1.b_col 
    FROM TableA AS A1 
     INNER JOIN TableB AS B1 ON A1.ID = B1.ID; 

はここでアクセスのANSI-92 Query ModeためのSQL DDLを使用してクイックスケッチ(あなたがアクセスUIを使用して、同じオブジェクトを作成することができます)です

INSERT INTO TestAB (a_col, b_col) VALUES (55, 99); 

この場合、1つのSQLコマンドで各テーブルに行が挿入されます。

あなたの属性に名前を付ける際には、厳密には厳しくなっていないようです。 Table1.idpod_idの名前をTable2に変更し、idという名前がスキーマ内で一意ではありません。

+0

私はあまり明確ではありませんでしたが、私は、....両方のテーブル(1と2)のフィールド** id **が一意(プライマリキーセット)と自動インクリメントだと思う。フィールド**テーブル2のpod_id **は、テーブル1のフィールド** id **の値をとります。これは、両方のテーブルから両方のテーブルにデータを書き込む単一のクエリ(つまり、挿入を意味します)です。 – Adrian

+0

@Adrian:両方のテーブルでフィールド名が「id」の場合は問題ありません。 'Table1.id'の名前を' Table1.pod_id'に変更してください。 – onedaywhen

0

私は、すべてのデータをretriveするシートの間のJOINを行うために...この...

INSERT INTO [table1] ([data]) 
OUTPUT [inserted].[id], [external_table].[col2] 
INTO [table2] SELECT [col1] 
FROM [external_table] 

と最後のSELECTで見つかりましたか?

このように機能していますか?

関連する問題