我的不幸任务是必须定期将数据从excel导入数据库。该表如下所示:
IssueID References 1234 DocID1<cr>DocID2<cr>DocID3 1235 DocID1 1236 DocID2 1237 DocID2<cr>DocID3
引用是一个多行文本字段。我想做的是创建一个与Issue表具有一对多关系的Docs表,而不是具有这些多行引用。
我定义了以下表格:
问题:IssueKey,IssueID,IssueFields
Doc:DocKey,DocID,DocRev,DocOwner等
DocLink:LinkKey,DocKey,IssueKey
由于此操作将重复运行,因此Doc表将已经存在,并且定义了DocID。因此,我想做的是对“引用”列中的每个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&’ ‘)]
结论:访问很烂
我认为标题中使用“ parse”一词使每个人都感到困惑。Access中的错误是对查询(而不是表)执行的相关查询会导致挂起。因此,我创建了一个临时表,将“参考”列(带有多行文本)投放到“问题”表,以便可以访问其他字段。最终查询将创建上述链接表以及DocID和IssueID以供参考:
SELECT Q1.IssueID, Q1.IssueKey, D1.DocKey, D1.DocID FROM Issues AS Q1, Documents AS D1 WHERE Q1.IssueID in (SELECT Q2.IssueID FROM Issues AS Q2 WHERE Q2.References LIKE ("*" & D1.DocID & "*"));
内部选择将拉出在参考列中具有给定文档的问题列表。外部选择对每个文档执行此操作,从而生成汇总列表。