VBA - 在两个表中插入,其中第一个表中的 id 是第二个字段

Posted

技术标签:

【中文标题】VBA - 在两个表中插入,其中第一个表中的 id 是第二个字段【英文标题】:VBA - Insert in two table where id from first table is a field in second 【发布时间】:2016-09-14 06:54:38 【问题描述】:

我在两张 Excel 表格中构建了大量数据,其中包含以下列:

EXCEL DATA

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

-关系在 sheet1.podsheet2.pod 之间(一对多关系)

我需要一个 sql 来将该 excel 表中的数据插入到具有以下表结构的 access 数据库中:

ACCESS DATABASE

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

其中 table2.pod_id = table1.id

可以在一次 sql 插入中完成吗?

我想出了这个批量插入...

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 以将数据插入 table2 的?

【问题讨论】:

原始数据中idpodpod_id之间没有关系所以no,这是做不到的。见minimal reproducible example。 sheet1 中的 pod 包含唯一值,sheet2 包含链接到 pod的多条记录> 从第一张纸开始 - pod.sheet1pod.sheet2 之间的关系(一对多) 请看***.com/questions/595132/…,我不知道的是,访问支持@@Identity。也许这个问题对你有一点帮助? 【参考方案1】:

假设您在表 1 中的 pod-column 是唯一的,您必须插入,再次选择条件 SELECT id FROM table1 WHERE pod = 'myCurrentPod' 并且有您的 ID。

如果 pod 不是唯一的,甚至具有其他已知值的 pod 也不是唯一的,那么就没有机会这样做。 如果其他已知值的 pod 是唯一的,则可以将上面的语句扩展为更多的条件。

在所有情况下,您都不能进行批量插入,而是从 sheet1 插入一行,从 sheet2 插入链接行,下一个 sheet1-row 等等。

如果您可以设计表格,则不应使用自动增量 ID,而应使用应用程序集 ID。或者,如果您在 pod 中的值非常独特,请将其用作 pk。

【讨论】:

hmm... table1 中的 pod 不是唯一的,可以存在来自不同会话的同一 pod 的多个记录(从 excel 表导入) ...这就是为什么我添加了一个字段 pod_id 以在访问中建立关系并保留 POD 的历史记录(如果您知道我的意思) 只有 excel sheet1 中的 pod 在单个会话中是唯一的【参考方案2】:

当您的列命名正确(即每个属性在整个架构中唯一且一致地命名)并且按预期设置外键时,可以在一次插入中完成。

这是使用 SQL DDL for Access 的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.idTable2 中将名称更改为 pod_id 并且 id 在您的架构中不是唯一的。

【讨论】:

我认为我不是很明确,.... 两个表(1 和 2)的字段 id 都是唯一的(主键集)并且自动递增。 table2 的字段 pod_id 正在获取 table1 的字段 id 的值-我想做-并在单个查询中(我的意思是插入)将数据从两个工作表写入两者表。 @Adrian: 好的,所以在两个表中都有字段名称id 不好,重命名它们以使它们保持一致,例如将 Table1.id 重命名为 Table1.pod_id【参考方案3】:

我找到了这个...

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

最后 SELECT ... 在工作表之间进行 JOIN 以检索所有数据?

它是这样工作的吗?

【讨论】:

以上是关于VBA - 在两个表中插入,其中第一个表中的 id 是第二个字段的主要内容,如果未能解决你的问题,请参考以下文章

将两个表中的值插入第三个表[关闭]

在EXCEL中如何将其中一个表中的数据插入另一个表中,两表中其有一有列是相同的?怎么把两个表合为一个?

利用vba怎样编写将工作表中第三行到最后一行(不确定)的数据复制并插入到另一个工作表的第二行前?

使用 VBA 在 Access 表中插入当前月份的每个日期记录

SQL语句怎么同时往两个表中插入不同的记录

将两个数组插入到一个mysql表中