MS Access使用DISTINCT查询时长文本字段被截断如何解决
问题原因
Access的DISTINCT关键字存在固有处理逻辑:对长文本(原Memo类型)字段做去重判断时,仅识别字段前255个字符,超出部分会被直接截断,无法完整返回长文本内容。
可行解决方案
- 方案1:用
GROUP BY搭配First()函数替代DISTINCT
从给出的原始结果可以看到,所有重复记录都是同一ProcessM_ID对应的完全一致的拼接结果,不需要对长文本字段本身做去重判断,仅需按唯一标识ProcessM_ID分组,取分组内第一个长文本值即可,既可以去除重复行,又不会触发长文本截断逻辑,参考代码:
SELECT DD_MASB.ProcessM_ID, First(CONCATRELATED("[DDM]","DD_MASB","ProcessM_ID = " & [ProcessM_ID])) AS DDMASB_Merged, First(CONCATRELATED("[DDM_Process]","DD_MASB","ProcessM_ID =" & [ProcessM_ID])) AS DDMProcess_Merged FROM DD_MASB GROUP BY DD_MASB.ProcessM_ID;
- 方案2:先筛选唯一ID再计算拼接字段(性能更优)
先通过子查询取出DD_MASB表中去重后的ProcessM_ID集合,再基于这批唯一ID计算两个拼接字段。这个写法里DISTINCT只作用在短数字类型的ProcessM_ID字段上,完全不会触碰长文本内容,从根源上避免截断问题;同时子查询已经提前过滤了重复ID,最终结果不会出现重复行,还能减少CONCATRELATED函数的重复计算次数,数据量较大时查询效率更高,参考代码:
SELECT unique_id.ProcessM_ID, CONCATRELATED("[DDM]","DD_MASB","ProcessM_ID = " & unique_id.ProcessM_ID) AS DDMASB_Merged, CONCATRELATED("[DDM_Process]","DD_MASB","ProcessM_ID =" & unique_id.ProcessM_ID) AS DDMProcess_Merged FROM (SELECT DISTINCT ProcessM_ID FROM DD_MASB) AS unique_id;
注意事项
- 日常写查询时尽量避免直接对长文本类型字段使用
DISTINCT去重,所有去重逻辑优先落在短数据类型的唯一标识字段上,即可规避这类截断问题。
内容的提问来源于stack exchange,提问作者scoosch
相关产品推荐
相关产品推荐

