【发布时间】:2014-01-23 16:12:43
【问题描述】:
我在一个使用 MS Access 2013 的项目上工作了很长时间。我遇到的一个问题是我在表格中有非常长的“评论”,我需要分解并插入到新表格中。每个评论都链接到一个“RouteID”,两者之间的关系可以是多对多的。我遇到的主要问题是我要从中移动数据的表中有重复的 cmets。无需保留重复的“评论”,行中的唯一区别是“RouteID”。基本上我有一个旧 cmets 表和一个新 cmets 表。
我的问题是它没有正确检查我的旧表中的 cmets 是否在新表中并且正在创建重复项。
有些评论被发现是重复的,有些则不是,被发现不重复的 cmets 的大小因大小和符号而异,从短到长不等。
这是我编写的一些代码,我尝试了多个版本的 SQL 和 VBA/VB6 代码,但结果仍然相同,重复的 cmets 出现在我的新表中。无论是否与我的问题有关,请随时批评。
我知道有些查询可能太长而无法工作,所以我做了一个 SQL 查询来比较 TABLE'S,但是这也失败了,并且仍然存在重复的 cmets。我检查了我的代码,我不认为我的逻辑不正确
请帮忙!在我的朋友/教授圈子里似乎没有人知道该怎么做。我有一个想法,把 cmets 和 HASH 放到一个类似的表中,然后用它来检查
If Not (rsOLD.EOF And rsOLD.BOF) Then
rsOLD.MoveFirst
Do Until (rsOLD.EOF = True)
TComment = rsOLD(CommentColumn)
TResponse = rsOLD(ResponseColumn)
If Not IsNull(TComment) Then
TComment = Replace(TComment, "'", "''")
SQL = "SELECT Comment, ID FROM Comments WHERE Comment = (SELECT '" & CommentColumn & _
"' FROM CommentsOld WHERE (CommentsOld.ID = " & rsOLD!ID & "));"
'SQL = "SELECT Comment FROM Comments" & _
' " INNER JOIN CommentsOld" & _
' " ON Comments.Comment = CommentsOld." & CommentColumn & _
' " WHERE CommentsOld.ID = " & rsOLD!ID & ";"
Set rsCHECK = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
If (rsCHECK.EOF And rsCHECK.BOF) Then 'IF COMMENT DOES NOT EXIST, NOTHING FOUND
我曾尝试使用循环通过记录集的 bool 函数,但考虑到每个表中记录的大小,循环的 BigO 太大,无法在合理的时间内完成。
【问题讨论】:
-
请仅发布相关代码并缩小代码的实际问题
-
您是说代码无法识别真正重复但不是精确字符串匹配的 cmets(例如,由于尾随空格、嵌入换行符或类似原因),还是问题所在比这更微妙?
-
我把代码删减了一些,主要检查在底部。注释的 SQL 代码是我尝试过但无法完成的,因为两者之间的内部连接导致错误,因为这两个表之间的类型不同(从我读到的),但是它们都是相同的。例如,对于重复项,多次插入新表的是“[Forest Service comment]”,我没有看到任何额外/尾随 WS 或换行符。
-
基本上 rsCHECK.EOF 和 rsCHECK.BOF 总是 True。我还使用了 DLookup() 并检查了它的 VBnullString 以及大于零的长度并得到了相同的结果。
标签: sql vba ms-access vb6 ms-access-2013