sqlalchemy的关联子查询

本文介绍了在使用SQLAlchemy时遇到的关联子查询问题,通过一个具体的SQL语句示例,展示了如何处理COUNT为0时丢失记录的情况。在尝试ORM和OUTER JOIN未果后,最终通过子查询和correlate、as_scalar方法成功解决。
摘要由CSDN通过智能技术生成

SQLAlchemy也算是用过好几年了,不过一直都用着其中相对简单的一小部分,最近写个程序碰到个问题,需要作一个关联子查询,类似这样的SQL语句:

SELECT master.*, (
    SELECT count(*) 
    FROM detail 
    WHERE detail.parentid=master.id AND detail.someflag IS NOT NULL
) FROM master;

试了很久不知道怎么用ORM来写。

如果COUNT不为0,用下面这个查询的结果是一样的:

SELECT master.id, count(detail.id) 
FROM master 
INNER JOIN detail ON detail.parentid=master.id 
WHERE detail.someflag IS NOT NULL 
GROUP BY master.id;

这个语句倒是可以用ORM实现:

qry = orm.query(master, func.count(detail.id).join(detail, 
    detail.parentid==master.id).filter(detail.someflag!=None).group_by(master)

但是如果COUNT为0就不行了,即便用OUTER JOIN也不行,这种情况下会丢失COUNT为0的master记录。

想来想去大概只能用子查询实现,但是试了这样的语句,结果跟上面一个是一样的,也会丢失COUNT为0的master记录。


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值