已知条件
- 有数据表: TABLEA;
- 多值字段: FIELD1;
- 用户账号: userAdmin (管理员);
- userAdmin 有表 TABLEA 的全部权限(检索/管理/更新/添加/删除); 此问题与权限无关
- 多值字段 FIELD1 ∈ TABLEA;
检索语句
检索1
|
|
操作发现
使用 userAdmin 在数据库对表 TABLEA 与多值字段 FIELD1 使用 检索1 进行分组查询. 返回的结果中, FIELD1 中的多值未被正确拆分. 如下图所示:
尝试
-
因原问题检索中含有更多的WHERE 条件, 所以首先考虑是否是WHERE 语句带来的问题. 去掉WHERE 语句后, 问题仍复现, 遂抽象为 检索1.
-
考虑在分组查询时带入排序词典.
-
在库中找到数据表 TABLEB, 发现其为 FIELD1 字段内容相关的对照表, 使用其内容构造排序字典 DICT_F.
1 2 3 4 5 6 7
CREATE SORTDICT DICT_F PATH 'E:\KBASEDATA\KDICT' ALIASNAME 'FIELD1' ORDER BY SPELL MAXWORDLEN 0 SORTVALUENUM 1 GO
因为没找到字典引入关联表的语句, 所以手动在企业管理器引入. (右键-[从表中导入词条])
1 2 3 4 5
-- 创建排序索引: DBUM MAKE SORTCOL BY DICT_F (TABLEA.FIELD1) -- 刷新排序索引文件: DBUM REFRESH SORTFILE OF TABLE TABLEA
-
修改 检索1 在分组查询时带入排序词典
检索2
1 2 3 4
--检索2 SELECT FIELD1, count(*) as COUNT FROM TABLEA GROUP BY (FIELD1, DICT_F)
使用修改后的 检索2 进行分组查询. 返回的结果中, FIELD1 中的多值仍未被正确拆分.
检查发现, DICT_F 中的词条来源于对照表 TABLEB, 但 TABLEA 的字段 FIELD1, 包含的值超过 对照表 TABLEB 的内容. 咨询相关开发同事后, 他说对照表 TABLEB 中未收录的 FIELD1 内容, 是在实际使用中用不上的项值. 但 DICT_F 中的词条不全会影响到分组查询对结果的拆分.
考虑直接把 TABLEA 中的字段 FIELD1 引入字典 DICT_F, 查询说明书后发现没有合适的函数自动帮我对多值字段进行拆分, 遂放弃直接引入. -
-
由 TABLEA 的字段 FIELD1 制作一张包含其字段全部项值的对照表 TABLEC, 然后将其字段引入字典 DICT_F.
1
...... 省去生成 TABLEC 数据, 新建表, 刷索引的过程 ......
把 TABLEB 和 TABLEC 中的对应字段引入字典 DICT_F. 再次使用 检索2 进行分组查询. 返回的结果中, FIELD1 中的多值仍未被正确拆分.
-
重新索引表 TABLEA, 因为 TABLEA 有点大, 所以做排序索引一直只更新了索引, 没有重新索引表. 索引完成后, 问题仍未解决.
-
请教同事后, 发现我在创建字典时排序值个数不对.
建词典的时候,这个要设置成多值。设置成10或者15 。
删除原有排序字典后, 重新创建排序字典 DICT_F.
发现, 在原数据表 TABLEA 中, 多值字段 FIELD1 的数据类型是 MVCHAR, 索引类型是 MSTRCHAR. MSTRCHAR 是文本索引类型, 不适合当前的 FIELD1.
将表 TABLEA 的字段 FIELD1 的索引类型修改为 MVCHAR. 修改后重新对字段 FIELD1 进行索引.
再使用 检索2 进行分组查询, 发现可以成功返回拆分后的统计结果.
结论R
如果发现分组查询多值字段不拆分后:
- 检查该字段数据类型/索引类型是否正确, 可以使用 MVCHAR, 但不要使用 MSTRCHAR.
- 分组查询时, GROUP BY语句应该使用
<分组列>::= (<列名> , <排序词典名>)[ASC|DESC]
. - 创建排序字典时, 排序值要设置为多值, 一般设置为 10 或者 15.
- GROUP BY语句分组查询时, 被查询的字段内的值需要全部存在于排序字典中.
- 别忘了在被查表中添加排序索引, 并更新.