SQLite单次查询获取多组符合不同条件的唯一不重复行咨询
实现方案
该需求可通过单次SQLite查询实现,无需拆分查询加额外过滤逻辑。
核心实现思路
利用UNION ALL将不同词类的候选池合并,配合随机排序和去重逻辑,即可一次性返回指定数量、互不重复且满足对应词类非空条件的结果。
示例SQL(以查询degree、adjective、object三类词为例)
WITH typed_candidates AS ( -- 每个UNION ALL块对应一类需要查询的词 SELECT 'degree' AS type, word, degree AS rule_id, random() AS priority FROM wordLibrary WHERE degree IS NOT NULL UNION ALL SELECT 'adjective' AS type, word, adjective AS rule_id, random() AS priority FROM wordLibrary WHERE adjective IS NOT NULL UNION ALL SELECT 'object' AS type, word, object AS rule_id, random() AS priority FROM wordLibrary WHERE object IS NOT NULL ), ranked AS ( -- 按优先级排序,同时给重复单词打标记,保证同一个单词只被选中一次 SELECT *, ROW_NUMBER() OVER (PARTITION BY word ORDER BY priority) AS word_rn, ROW_NUMBER() OVER (PARTITION BY type ORDER BY priority) AS type_rn FROM typed_candidates ) SELECT type, word, rule_id FROM ranked WHERE word_rn = 1 -- 过滤掉重复出现的单词 AND type_rn = 1 -- 每个词类取优先级最高的1个 ORDER BY type;
方案说明
- 动态适配:如果需要查询的词类列表是动态的,只需在Python侧根据输入的列名列表,动态生成对应
UNION ALL的子句即可,无需修改固定逻辑 - 性能优势:相比拆分多次查询+已选词过滤的方案,单次查询仅需扫一次表,避免多次IO开销,同时天然避免了多次查询时词库余量不足的问题
- 结果保证:返回行数和你输入的词类数量完全一致,每个单词只会被分配到一个词类,不会出现重复选词问题
备选方案(不推荐)
如果你不想维护动态SQL,也可以在原有单类查询的基础上增加已选词过滤,每次查询补充WHERE word NOT IN ('已选词1', '已选词2')的条件,该方案实现简单但性能更低,词库较小时可能出现无符合条件结果的异常。
内容的提问来源于stack exchange,提问作者fyrkantis
相关产品推荐
相关产品推荐

