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.pod 和 sheet2.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 的?
【问题讨论】:
原始数据中id、pod和pod_id之间没有关系所以no,这是做不到的。见minimal reproducible example。 sheet1 中的 pod 包含唯一值,sheet2 包含链接到 pod的多条记录> 从第一张纸开始 - pod.sheet1 和 pod.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.id
在 Table2
中将名称更改为 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怎样编写将工作表中第三行到最后一行(不确定)的数据复制并插入到另一个工作表的第二行前?