sqlalchemy的关联子查询
2015-09-25 17:13
375 查看
SQLAlchemy也算是用过好几年了,不过一直都用着其中相对简单的一小部分,最近写个程序碰到个问题,需要作一个关联子查询,类似这样的SQL语句:
如果COUNT不为0,用下面这个查询的结果是一样的:
想来想去大概只能用子查询实现,但是试了这样的语句,结果跟上面一个是一样的,也会丢失COUNT为0的master记录。
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记录。
subqry = orm.query(detail.parentid, func.count(detail.id).label( "flagcnt").filter(detail.someflag!=None).group_by(detail.parentid).subquery() qry = orm.query(master, subqry.c.flagcnt).join(subqry, subqry.c.parentid==master.id)这句的SQL相当于这样:
SELECT master.id, subqry.flagcnt FROM master JOIN ( SELECT detail.parentid, count(*) AS flagcnt FROM detail WHERE detail.someflag IS NOT NULL GROUP BY detail.parentid ) AS subqry ON subqry.parentid=master.id没办法,只好继续搜索,最后还是在SO上看到一个类似问题的答案而受到启发,解决了这个困扰了一天多的问题。
subqry = orm.query(func.count(detail.id).label("flagcnt")).filter( detail.parentid==master.id).filter(detail.someflag!=None).correlate(master).as_scalar() qry = orm.query(master, subqry)其中的重点就在于correlate和as_scalar。
相关文章推荐
- PostgreSQL 资源
- xtrabackup备份
- How to do a deep SQL tuning
- redis 源代码编绎
- mysql Writing to net & max_allowed_packet
- redis 主从实现
- hash join (Oracle里的哈希连接原理)
- sql实现有数据就更新,没有就插入
- 通过sql语句查看MYSQL表占空间,数据库所占空间
- oracle 树查询
- SQLServer2008/2005 生成数据字典SQL语句
- redis cluster实现
- windows下mongodb 安装
- .net跨防火墙链接oracle连接池链接长时间无通讯数据被断开后报错问题解决
- vs2008C1902数据库管理程序不匹配
- Oracle-trace文件分析
- 关于数据读取插入(C#,SQLite)
- 两个数据库进行数据比对(DataTable对比)
- SQL之时区、时间戳相关的函数
- 你不知道的sql小知识