SQLAlchemy实现Postgres DISTINCT ON关联查询报子查询返回多列错误如何解决
你当前写法的问题是,把「取每个帖子最新评论」的子查询错误放到了JOIN的ON条件中,ON子句只接受返回布尔值的条件表达式,你塞进去的多列子查询自然会触发subquery must return only one column的语法错误。
正确的逻辑是先将去重取最新评论的逻辑封装成独立的派生表,再和posts表做左连接,写法如下:
正确代码(SQLAlchemy Core 写法)
# 第一步:构造每个帖子最新评论的子查询 latest_comments_subq = select(comments) \ .distinct(comments.c.post_id) \ .order_by(comments.c.post_id, comments.c.timestamp.desc()) \ .subquery(name="latest_comments") # 第二步:主查询左连接上述子查询 query = select(posts, latest_comments_subq.c.text) \ .outerjoin(latest_comments_subq, posts.c.id == latest_comments_subq.c.post_id) \ .where(posts.c.timestamp >= start_date)
生成的SQL和你预期的原生SQL完全一致:
SELECT posts.*, latest_comments.text FROM posts LEFT JOIN ( SELECT DISTINCT ON (comments.post_id) comments.* FROM comments ORDER BY comments.post_id, comments.timestamp DESC ) AS latest_comments ON posts.id = latest_comments.post_id WHERE posts.timestamp >= %(start_date)s
如果是用SQLAlchemy ORM,只要把对应的Table对象替换成你的ORM模型类即可,子查询的构造逻辑完全相同。
内容的提问来源于stack exchange,提问作者Carasel
相关产品推荐
相关产品推荐

