2016-09-14 152 views
0

我有兩個結構化數據練成有以下的列片的龐大量的字段:VBA - 插入兩個表,其中從第一表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(一到一對多的關係)

我需要一個SQL從該Excel表數據具有以下的表結構插入到接入數據庫:

ACCESS DATABASE 

Table1 [id, pod, client, address, ...etc] 
Table2 [id, pod_id, pod, pointofmeasure, typepct, ...etc] 

其中table2.pod_id = table1.id

可以在一個SQL插入?

我想出了這個質量INSERT ...

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 

現在到底如何我得到的ID將數據插入到表2?

+0

原始數據中的** id **,** pod **和** pod_id **之間沒有任何關係,所以** no **,它不能完成。見[mcve]。 – Jeeped

+0

** _sheet1_中的pod **包含唯一值,_sheet2_包含多個記錄,該記錄與第一張表中的** pod相關聯 - 關係介於** pod.sheet1 **和** pod.sheet2 **(一對一 - 曼尼) – Adrian

+0

請看看http://stackoverflow.com/questions/595132/how-to-get-id-of-newly-inserted-record-using-excel-vba?rq=1,我做了什麼不知道的是,該訪問支持@@身份。也許這個問題可以幫助你一點嗎? – swe

回答

0

假設表1中您的pod-column是唯一的,您必須插入,再次選擇條件SELECT id FROM table1 WHERE pod = 'myCurrentPod',並且存在您的ID。

如果pod不是唯一的,即使與其他已知值的pod不是唯一的,也沒有機會這樣做。 如果其他已知值的pod是唯一的,則可以使用更多條件擴展上面的語句。

在所有情況下,您都無法進行批量插入,但是可以從sheet1中插入一行,在sheet2中插入鏈接的行,在sheet1-row中插入等等。

如果您可以設計表格,則不應該使用自動增量ID,而是使用應用程序組ID。或者,如果您的pod中的值非常獨特,請將其用作pk。

+0

hmm ... **來自table1的pod **不是唯一的,可以存在來自不同會話(從excel表格導入)相同的** pod **的多個記錄...這就是爲什麼我添加了一個字段** pod_id * *在訪問中創建關係並保留POD的歷史記錄 – Adrian

+0

只有**表格1中的** pod **在單個會話中是唯一的 – Adrian

+0

@Adrian我編輯了我的答案 – swe

0

當您的列命名正確時(即每個屬性在整個架構中唯一且一致地命名)並且外鍵按預期設置時,可以在一個插入內完成。

這裏有一個快速草圖使用SQL DDL用於訪問的ANSI-92 Query Mode(你可以創建使用Access UI相同的對象):

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; 

如果再通過視圖插入,省略ID列(從而使其自動生成)如下:

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

然後一行將被插入到每個表中的單個SQL命令。

也就是說,在命名屬性時看起來不夠嚴格, Table1.id更改名稱爲pod_idTable2id在您的模式中不是唯一的。

+0

我並不十分明確,我認爲,兩個表(1和2)的fields ** id **都是唯一的(主鍵集)和自動遞增。表2的字段** pod_id **正在取得表1的字段** id **的值 - 我想要做 - 並且在單個查詢(我的意思是插入)將數據從兩個表寫入到兩個表中。 – Adrian

+0

@Adrian:好的,所以在兩個表中都有字段名稱爲「id」並不好,請重命名它們以使它們一致,例如,將'Table1.id'重命名爲'Table1.pod_id'。 – onedaywhen

0

我發現了這個...

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

,並在最後一個SELECT ...做表之間的連接以檢索所有的數據?

它的工作方式?

相關問題