You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将针对tasks和entries表的两次查询合并为单次查询?

单个查询实现为每个活跃Task获取随机Entry

当然可以用单次查询实现需求,同时保留每个活跃Task对应一个随机Entry的限制,这里提供两种适用于PostgreSQL的实现方式:

方式一:使用窗口函数ROW_NUMBER()

WITH task_entries AS (
    SELECT
        t.id AS task_id,
        t.channel_id,
        e.name,
        e.description,
        ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY random()) AS rn
    FROM tasks t
    JOIN entries e ON t.type = e.type
    WHERE t.is_active = true
)
SELECT channel_id, name, description
FROM task_entries
WHERE rn = 1;

逻辑说明:

  • 通过JOIN关联所有活跃Task(t.is_active = true)和对应类型的Entry
  • 利用ROW_NUMBER()窗口函数,按每个Task的ID分组(PARTITION BY t.id),分组内的Entry按随机顺序排序(ORDER BY random()),这样每个分组里的第一条记录(rn = 1)就是该Task对应的随机Entry
  • 最后筛选出每组的第一条记录,得到目标结果

方式二:使用PostgreSQL特有的DISTINCT ON

SELECT DISTINCT ON (t.id)
    t.channel_id,
    e.name,
    e.description
FROM tasks t
JOIN entries e ON t.type = e.type
WHERE t.is_active = true
ORDER BY t.id, random();

逻辑说明:

  • DISTINCT ON (t.id)会强制每个Task ID只返回一条记录
  • ORDER BY子句先按Task ID分组,再按随机顺序排序,这样每个分组的第一条记录就是随机选中的Entry,语法更简洁

内容的提问来源于stack exchange,提问作者theberzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:10:35