echo 獭獭笔记 | less
分组查询时多值字段查询结果不拆分kbase

已知条件

  • 有数据表: TABLEA;
  • 多值字段: FIELD1;
  • 用户账号: userAdmin (管理员);
  • userAdmin 有表 TABLEA 的全部权限(检索/管理/更新/添加/删除); 此问题与权限无关
  • 多值字段 FIELD1 ∈ TABLEA;

检索语句

检索1

1
2
3
4
--检索1
SELECT FIELD1, count(*) as COUNT
FROM TABLEA
GROUP BY FIELD1

操作发现

使用 userAdmin 在数据库对表 TABLEA 与多值字段 FIELD1 使用 检索1 进行分组查询. 返回的结果中, FIELD1 中的多值未被正确拆分. 如下图所示:

尝试

  1. 因原问题检索中含有更多的WHERE 条件, 所以首先考虑是否是WHERE 语句带来的问题. 去掉WHERE 语句后, 问题仍复现, 遂抽象为 检索1.

  2. 考虑在分组查询时带入排序词典.

    • 在库中找到数据表 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, 查询说明书后发现没有合适的函数自动帮我对多值字段进行拆分, 遂放弃直接引入.

  3. 由 TABLEA 的字段 FIELD1 制作一张包含其字段全部项值的对照表 TABLEC, 然后将其字段引入字典 DICT_F.

    1
    
    ...... 省去生成 TABLEC 数据, 新建表, 刷索引的过程 ......
    

    把 TABLEB 和 TABLEC 中的对应字段引入字典 DICT_F. 再次使用 检索2 进行分组查询. 返回的结果中, FIELD1 中的多值仍未被正确拆分.

  4. 重新索引表 TABLEA, 因为 TABLEA 有点大, 所以做排序索引一直只更新了索引, 没有重新索引表. 索引完成后, 问题仍未解决.

  5. 请教同事后, 发现我在创建字典时排序值个数不对.

    建词典的时候,这个要设置成多值。设置成10或者15 。

    删除原有排序字典后, 重新创建排序字典 DICT_F.
    发现, 在原数据表 TABLEA 中, 多值字段 FIELD1 的数据类型是 MVCHAR, 索引类型是 MSTRCHAR. MSTRCHAR 是文本索引类型, 不适合当前的 FIELD1.
    将表 TABLEA 的字段 FIELD1 的索引类型修改为 MVCHAR. 修改后重新对字段 FIELD1 进行索引.
    再使用 检索2 进行分组查询, 发现可以成功返回拆分后的统计结果.

结论R

如果发现分组查询多值字段不拆分后:

  1. 检查该字段数据类型/索引类型是否正确, 可以使用 MVCHAR, 但不要使用 MSTRCHAR.
  2. 分组查询时, GROUP BY语句应该使用 <分组列>::= (<列名> , <排序词典名>)[ASC|DESC].
  3. 创建排序字典时, 排序值要设置为多值, 一般设置为 10 或者 15.
  4. GROUP BY语句分组查询时, 被查询的字段内的值需要全部存在于排序字典中.
  5. 别忘了在被查表中添加排序索引, 并更新.