我有一个不幸的任务,就是必须定期将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/

10-13 06:39