我有一个不幸的任务,就是必须定期将excel中的数据导入数据库。桌子看起来像这样:
IssueID References
1234 DocID1<cr>DocID2<cr>DocID3
1235 DocID1
1236 DocID2
1237 DocID2<cr>DocID3
引用是一个多行文本字段。我要做的是创建一个与问题表有一对多关系的Docs表,而不是创建这些多行引用。
我定义了以下表格:
问题:IssueKey、IssueID、IssueFields
文档:docy、DocID、DocRev、DocOwner等
DocLink:链接键,DocKey,IssueKey
由于这将重复运行,DOC表将已经存在,并定义了DOCSID。所以,我想做的是对参考列中的每个docID进行查询或VBA代码搜索,如果没有存在,则添加基于SexEID的链接。
很简单,对吧?
杰夫
澄清:
1)我有一个名为“Val1”的第三个专栏来说明还有其他专栏,但这似乎混淆了这个问题。实际上,源表中有很多列(很多列都被忽略了),但我只关心上面的两个列。
2)我不必解析分隔符或任何过于偏执的东西:引用包含一个或多个唯一定义的文档引用号(存储为文本)。因此,一个LIKE过滤器将逐个显示问题列表。
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)。不幸的是,它会导致访问崩溃,所以我无法判断语法是否正确(经过编辑以反映上面的字段名)。
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)暂时放弃访问,我在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%'));
这正如我所期望的那样工作-我得到每个IssueID,其中引用DocID1,对表中的每个Doc重复。根据上述数据,情况如下:
IssueID References
1234 DocID1
1234 DocID2
1234 DocID3
1235 DocID1
1235 DocID2
1235 DocID3
现在我只想用“%”+D1.DocID+“%”替换“%DocID1%”-将结果限制为那些实际具有匹配项的文档id。出于某种原因,当我这样做的时候,我得到的记录是零——我想我把通配符放在相关字段上的语法是错误的。
6)在MySQL中,下面的工作提供了上面的#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
CONCAT('%',D1.DocID,'%')));
[在访问中变成(''&D1.DocID&'')]
结论:接入很差
最佳答案
答案如下:
Q2.References LIKE ("*" & D1.DocID & "*"));
不过,我觉得这不安全。
请考虑名为“References”的列的某个值是否包含以下数据:
DocID1<cr>DocID999<cr>DocID3
另一个表中存在值
DocID = 9
。问题是
"DocID1<cr>DocID999<cr>DocID3" LIKE "*" & "DocID9" & "*"
将评估为
TRUE
,这可能是不可取的。为了解决这个问题,我认为search/join条件中的值应该通过使用分隔符(例如。
(CHR(13) & Q2.References & CHR(13)) LIKE ("*" & CHR(13) & D1.DocID & CHR(13) & "*"));
关于sql - SQL用于解析多行数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/915814/