今天碰到一個很奇怪的問題,開發的一個考試系統採用Access數據庫作爲題庫,裏面建了類似下面這樣的臨時表用於導入Excel格式的題庫:
ID(自增,長整型) | 專業(文本) | 科目(文本) | 題型(文本) | 正文(備註) | 正文哈希(長整型) |
---|---|---|---|---|---|
1 | 計算機 | 數學 | 單選題 | AAA | FF |
2 | 計算機 | 數學 | 單選題 | BBB | CC |
3 | 信息工程 | 數學 | 單選題 | AAA | FF |
4 | 信息工程 | 數學 | 單選題 | CCC | DD |
先在Access 2007中創建了這樣結構的一個空表,然後將Excel題庫導入該表的專業、科目、題型、正文字段,再通過自定義的一個函數通過正文字段計算出正文哈希字段,如上表所示,隨後通過SQL語句:
SELECT DISTINCT 正文, 正文哈希 FROM 臨時表 AS A LEFT JOIN 問題正文表 AS B ON A.正文哈希=B.正文哈希 WHERE A.正文=B.正文
去重時卻發現DISTINCT去重失效了,如上面的表中,ID爲1和3的行正文和正文哈希均完全相同,但卻仍然兩個都顯示出來了,嘗試了很久才發現是因爲正文哈希字段設置了索引,導致DISTINCT失效,去掉該字段的索引就恢復正常了,但不知道爲什麼索引會影響DISTINCT去重。
PS:問題原因找到了,確認這是Access的一個BUG,觸發條件爲 正文字段爲備註 (Memo)、使用 LEFT JOIN (子查詢)時有時就會出現,解決辦法爲在出現BUG的語句後再添加一個WHERE子句,例如
SELECT DISTINCT 正文, 正文哈希 FROM 臨時表 AS A LEFT JOIN 問題正文表 AS B ON A.正文哈希=B.正文哈希 WHERE A.正文=B.正文 AND (A.正文哈希=0 OR A.正文哈希<>0)
可以HACK掉這個BUG