PostgreSQL查询报错relation c1不存在 如何获取各月10条随机记录
报错原因
你遇到的relation "c1" does not exist报错是因为LEFT JOIN后的子查询C3属于独立子查询,无法直接引用外层查询中C1表的C1.month字段,属于通用SQL语法限制,不是混用MySQL语法导致。
同时你的原有逻辑冗余,不需要额外做关联查询就能实现需求。
修正方案
你已经在CTE中用ROW_NUMBER()窗口函数按月份分组、随机排序生成了行号,直接过滤行号≤10即可实现每个月提取10条随机记录的需求。
优化后可运行代码
WITH CTE AS ( SELECT month, email, ROW_NUMBER() OVER (PARTITION BY month ORDER BY RANDOM()) AS RN FROM ( SELECT DISTINCT TO_CHAR(DATE_TRUNC('month', "timestamp"), 'YYYY-MM') AS month, CASE WHEN JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text(form_data,0),'name') = 'email' THEN JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text(form_data,0),'value') END AS email FROM form_submits_y2 fs WHERE fs.website_id = 791 -- 筛选2021年数据 AND EXTRACT(YEAR FROM "timestamp") = 2021 -- 排除未结束的12月 AND EXTRACT(MONTH FROM "timestamp") < 12 -- 过滤空邮箱无效记录 AND CASE WHEN JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text(form_data,0),'name') = 'email' THEN JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text(form_data,0),'value') END IS NOT NULL GROUP BY 1,2 ) t ) SELECT month AS "Month", email AS "Another header" FROM CTE WHERE RN <= 10 ORDER BY month ASC
调整说明
- 删除了冗余的LEFT JOIN逻辑,彻底解决原报错问题,执行效率也更高
- 调整了年份、月份的过滤逻辑,直接操作原始时间字段,避免部分数据库不支持WHERE子句引用SELECT别名的问题
- 新增空邮箱过滤,避免返回无邮箱的无效记录
- 输出字段名对齐你要求的表头格式,不需要额外处理即可匹配预期输出
如果使用的是MySQL数据库,需要做两处适配:将RANDOM()替换为RAND(),同时替换对应JSON解析函数为MySQL的JSON操作语法。
内容的提问来源于stack exchange,提问作者Zac C
相关产品推荐
相关产品推荐

