2014-01-23 112 views
1

我一直在使用MS Access 2013的項目工作了很長時間。我遇到的一個問題是我在表格i中有很長的「評論」需要分解並插入新表格。每條評論都鏈接到一個「RouteID」,它們之間的關係可以是多對多的。我遇到的主要問題是表格中有重複的註釋,我正在移動數據FROM。沒有必要保留重複的「評論」,唯一的區別在於「RouteID」。基本上我有一個老評論表和一個新評論表。VB6/SQL「長文本」沒有正確比較(MS Access 2013)

我的問題是它沒有正確地檢查我的OLD表中的評論是否在NEW表中並且正在創建重複項。

一些評論被發現是重複的,其他人不是,並且被發現不是重複的評論的大小根據大小和符號從短到長而變化。

這是我編寫的一些代碼,我嘗試過多個版本的SQL和VBA/VB6代碼,但結果仍然相同,重複的註釋顯示在我的新表中。請隨時批評這一點,無論它是否與我的問題有關。

我知道有些查詢可能會太長時間無法正常工作,所以我做了一個SQL查詢來比較TABLE'S,但同樣失敗並且重複的註釋依然存在。我檢查了我的代碼,我不相信我在做錯誤的邏輯

請幫忙!似乎沒有人知道我在朋友/教授的圈子裏做什麼。我有一個主意,採取了意見和哈希他們,把它們放在一個類似的表,並用它來檢查

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 

我試圖與通過記錄迴路一個布爾函數來工作,但的比戈鑑於每個表中記錄的大小,循環將在一段合理的時間內完成。

+3

請僅發佈相對代碼並縮小與您的代碼的實際問題 – 2014-01-23 16:18:07

+0

您是說代碼無法識別真正重複但不是精確字符串匹配的註釋(例如,由於尾隨空格或嵌入換行符,或類似的),還是比這個問題更微妙? –

+0

我削減了一些代碼,主要檢查是在底部。評論的SQL代碼是我嘗試過的東西,但無法完成,因爲兩個表之間的內部連接導致了錯誤,因爲兩個表之間存在不同的類型(來自我所讀的內容),但它們都是相同的。至於重複例如,多次插入到新表中的是「[Forest Service comment]」,我沒有看到任何額外/尾隨的WS或換行符。 – JaredTS486

回答

1

一個可能的原因是你的代碼是做

SQL = "SELECT Comment, ID FROM Comments WHERE Comment = (SELECT '" & CommentColumn & _ 
     "' FROM CommentsOld WHERE (CommentsOld.ID = " & rsOLD!ID & "));" 

因此而不是返回的,其名稱是在變量CommentColumn你作爲一個字符串返回列名的列內容。也就是說,如果CommentColumn包含"Column1"那麼你的SQL代碼是沒有做

... (Select Column1 FROM CommentsOld ... 

它做

... (Select 'Column1' FROM CommentsOld ... 

也許你應該嘗試

SQL = "SELECT Comment, ID FROM Comments WHERE Comment = (SELECT [" & CommentColumn & _ 
     "] FROM CommentsOld WHERE (CommentsOld.ID = " & rsOLD!ID & "));" 

編輯回覆:發表評論

由於其他與文本(短文本)字段w.r.t相比,e是對備忘錄(長文本)字段的一些重要限制。加入,DISTINCT查詢(在另一個答案中討論)等等,你的哈希思想開始變得越來越有吸引力。在答案here中有鏈接到一些VBA/VB6實現各種哈希算法。

爲每條評論生成一個哈希值可能會相當耗時,所以你可能只想做一次。如果您可以爲每個註釋列添加一個[..._ hash]列(例如,爲長文本列[CP1]添加一個名爲[CP1_hash]的短文本列)並將哈希存儲在那裏,那將是理想的。散列完成後,您可以比較評論哈希值而不是評論本身。另外,哈希列可以以其他有用的方式加入,完全索引和操縱。

(是的,會有一個哈希衝突的機率很小,但我認爲這將給予你很可能是處理字符串的長度是極不可能的。)

有一件事你一定會不是想要做的就是在WHERE子句或JOIN條件中使用哈希函數本身。這將導致表掃描並強制重新計算每行的所有散列值,並且這可能會減慢速度。

+0

使用括號「Run-time error'3342'時出現錯誤:子查詢'[CP1]中的無效備註,OLE或超鏈接對象' ''(這是列的名稱,代表評論期1)我現在記住這個,我回想一些東西。與我在嘗試使用Inner Join SQL查詢時遇到的錯誤類似。 – JaredTS486

+0

@ JaredTS486 I HAV e更新了我的答案。 –

+0

謝謝,我認爲這將是最好的,我有一個哈希函數設置,我希望它可以採取評論沒有問題。更不要說爲評論設置的可怕桌子了[圖片](https://dl.dropboxusercontent.com/u/25728887/Public%20Linked%20Images/2014-01-23_123950.png)。 – JaredTS486

0

以空表NewTable開始。然後運行此查詢:

insert into NewTable (Comment) 
SELECT distinct Comment 
FROM OldTable; 

'distinct'將排除所有重複項,所以最終在NewTable中應該是唯一的。然後,您可以瀏覽OldTable並根據每個RouteID進行操作。

+0

在Access中,SELECT DISTINCT和'Memo'('Long Text')字段不能很好地一起玩。在Access 2010中,您的聲明失敗,「該字段太小而無法接受您嘗試添加的數據量,請嘗試插入或粘貼更少的數據。」 (如果刪除了「DISTINCT」關鍵字,則該語句正常工作。) –

+0

嗯。我在Access 2013中用長文本字段進行了測試(但兩個表都是空的)。儘管它沒有做任何事情,但它運行良好。 ORDER BY是否對LongText有任何問題? –

+0

我在我的新表中看到重複的內容非常簡單,比如「[Forest Service comment]」,就是這樣。也許我需要先做一些衛生處理? – JaredTS486