PostgreSQL中外部分组结果用于子查询IN运算符的SQL语法错误
解决PostgreSQL中IN子查询使用DISTINCT的语法错误
嘿,这个问题我太熟悉了!你碰到的语法错误根源很明确——PostgreSQL里IN子句的括号里需要的是完整的子查询结果集,而DISTINCT是修饰SELECT语句的关键字,根本不能直接丢在IN的括号里。
先还原你出错的语句(大概是这样):
SELECT * FROM campaigns_reporting as cr1 -- 假设还有其他过滤条件 WHERE cr1.id IN (DISTINCT cr2.id from campaigns_reporting as cr2 where cr2.some_column = 'filter_value');
这种写法里,IN括号内的DISTINCT cr2.id ...不是合法的SQL结构,自然会触发syntax error at or near "DISTINCT"的报错。
正确的写法:把DISTINCT放到子查询的SELECT后面
你需要将DISTINCT移到子查询的SELECT关键字之后,让子查询先返回去重后的ID集合,再传给IN子句做匹配:
SELECT * FROM campaigns_reporting as cr1 -- 你的其他业务过滤条件 WHERE cr1.id IN ( SELECT DISTINCT cr2.id FROM campaigns_reporting as cr2 WHERE cr2.some_column = 'filter_value' -- 子查询的过滤逻辑 );
额外小提示:
其实PostgreSQL在处理IN子查询时,即使子查询返回重复值,也只会做一次匹配判断。如果你的子查询结果本身不会有重复的ID,完全可以去掉DISTINCT,效果完全一致;但如果子查询确实会返回大量重复值,加上DISTINCT能减少IN子句的匹配次数,略微提升查询性能。
内容的提问来源于stack exchange,提问作者MD. Jahidul Islam
相关产品推荐
相关产品推荐

