2016-09-14 151 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 ...做表之间的连接以检索所有的数据?

它的工作方式?

相关问题