【发布时间】:2009-05-27 13:48:09
【问题描述】:
不幸的是,我不得不定期将数据从 excel 导入数据库。该表如下所示:
IssueID References
1234 DocID1<cr>DocID2<cr>DocID3
1235 DocID1
1236 DocID2
1237 DocID2<cr>DocID3
参考是一个多行文本字段。我要做的是创建一个与 Issue 表具有一对多关系的 Docs 表,而不是拥有这些多行引用。
我定义了以下表格:
问题:IssueKey、IssueID、IssueFields
文档:DocKey、DocID、DocRev、DocOwner 等
DocLink:LinkKey、DocKey、IssueKey
由于这将重复运行,Doc 表将已经存在并定义了 DocID。所以,我想要做的是对 References 列中的每个 DocID 进行查询或 VBA 代码搜索,如果不存在,则添加基于 IssueID 的链接。
简单吧?
杰夫
说明:
1) 我有一个名为“Val1”的第三列,以显示还有其他列,但这似乎混淆了问题。源表中实际上有很多(很多,最被忽略的)列,但我只关心上面的两个。
2) 我不必解析分隔符或任何过于偏执的东西:参考包含一个或多个唯一定义的文档参考号(存储为文本)。因此,LIKE 过滤器将根据具体情况显示 IssueID 列表。
3) 以下是可接受的输出示例:
IssueID References
1234 DocID1
1234 DocID2
1234 DocID3
1235 DocID1
1236 DocID2
1237 DocID2
1237 DocID3
理想的解决方案是使用原始的 excel 表(顶部)和这两个表:
IssueKey IssueID
1 1234
2 1235
3 1236
4 1237
DocKey DocID
1 DocID1
2 DocID2
3 DocID3
并填充/更新链接表:
LinkKey IssueKey DocKey
1 1 1
2 1 2
3 1 3
4 2 1
5 3 2
6 3 3
4) 这是我期望的解决方案示例(创建上面的#3)。不幸的是,它使 Access 崩溃,所以我无法判断语法是否正确(已编辑以反映上面的字段名称)。
SELECT Q1.IssueID, D1.DocID
FROM Docs AS D1, Issues AS Q1
WHERE Q1.IssueID IN
((SELECT Q2.IssueID from Issues AS Q2 where (Q2.References) Like D1.DocID));
5) 暂时放弃 Access,我在 MySQL 中有以下工作:
SELECT Q1.IssueID, D1.DocID
FROM Docs AS D1, Issues AS Q1
WHERE Q1.IssueID IN
((SELECT Q2.IssueID from Issues AS Q2 where (Q2.References) Like '%DocID1%'));
这正如我所期望的那样工作 - 我得到每个带有对 DocID1 的引用的 IssueID,并为表中的每个 Doc 重复。有了上面的数据,它看起来像:
IssueID References
1234 DocID1
1234 DocID2
1234 DocID3
1235 DocID1
1235 DocID2
1235 DocID3
现在我只想将 '%DocID1%' 替换为 '%'+D1.DocID+'%' - 将结果限制为实际匹配的文档 ID。出于某种原因,当我这样做时,我得到零记录 - 我认为我在相关字段上放置通配符的语法错误。
6) 以下工作可在 MySQL 中提供上述 #3,但翻译为访问的相同查询使其崩溃:
SELECT Q1.IssueID, D1.DocID
FROM Docs AS D1, Issues AS Q1
WHERE Q1.IssueID IN
((SELECT Q2.IssueID from Issues AS Q2 where (Q2.References) Like
CONCAT('%',D1.DocID,'%')));
[在访问中变为 ('' & D1.DocID & '')]
结论:访问很烂
【问题讨论】:
-
快速评论:这是多对多的关系;)
-
授予 - 这就是我使用链接表的原因。我只是想通过要求一个方向的更新来简化问题:我想要每个 DocID 的 IssueID 列表。
-
SQL(Jet/ACE 风格)中的方法是解析文本列中的字符以查找分隔符——在您的情况下为 CHR(10)?您应该能够找到许多示例,例如这是我之前做的一个:groups.google.com/group/microsoft.public.access.modulesdaovba/…
-
...问题是,您真的想要一个 SQL 解决方案,即您是否会找到一个更容易遵循的 VBA 解决方案?
-
我更喜欢 SQL 解决方案,因为我不确定这将始终存在于 Access DB 中,并且我正在尝试了解一些更高级的 SQL 概念。
标签: sql mysql excel ms-access vba