Access SQL distinct 去重失效问题

今天碰到一个很奇怪的问题,开发的一个考试系统采用Access数据库作为题库,里面建了类似下面这样的临时表用于导入Excel格式的题库:

 

临时表
ID(自增,长整型)专业(文本)科目(文本)题型(文本)正文(备注)正文哈希(长整型)
1计算机数学单选题AAAFF
2计算机数学单选题BBBCC
3信息工程数学单选题AAAFF
4信息工程数学单选题CCCDD

 

先在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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值