admin

SQL用于解析多行数据?

sql

我的不幸任务是必须定期将数据从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&’ ‘)]

结论:访问很烂


阅读 237

收藏
2021-06-07

共1个答案

admin

我认为标题中使用“
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 & "*"));

内部选择将拉出在参考列中具有给定文档的问题列表。外部选择对每个文档执行此操作,从而生成汇总列表。

2021-06-07