sqlalchemy FULL OUTER JOIN

 openap卍巛i_r肀eport1 发布于 2023-02-13 09:53

如何在orm级别的sqlalchemy中实现FULL OUTER JOIN.

这是我的代码:

q1 = (db.session.query(
        tb1.user_id.label('u_id'),
        func.count(tb1.id).label('tb1_c')
    )
    .group_by(tb1.user_id)
)
q2 = (db.session.query(
        tb2.user_id.label('u_id'),
        func.count(tb2.id).label('tb2_c')
    )
    .group_by(tb2.user_id)
)

以上两个查询,我想对它们应用FULL OUTER JOIN.

1 个回答
  • 首先,sqlalchemy不支持FULL JOIN开箱即用,并且有一些很好的理由.因此,提出的任何解决方案将包括两部分:

      缺少功能的解决方法

      sqlalchemy为该解决方案构建查询的语法

    现在,出于避免这种情况的原因FULL JOIN,请阅读一些旧的博客更好的替代方案以进行全面的联接.从这篇博客中我将了解如何通过向缺少的列添加值和在intead 上聚合()来避免 .SA代码可能如下所示:FULL JOIN0SUMUNION ALL

    q1 = (session.query(
            tb1.user_id.label('u_id'),
            func.count(tb1.id).label('tb1_c'),
            literal(0).label('tb2_c'), # @NOTE: added 0
          ).group_by(tb1.user_id))
    q2 = (session.query(
            tb2.user_id.label('u_id'),
            literal(0).label('tb1_c'), # @NOTE: added 0
            func.count(tb2.id).label('tb2_c')
          ).group_by(tb2.user_id))
    
    qt = union_all(q1, q2).alias("united")
    qr = select([qt.c.u_id, func.sum(qt.c.tb1_c), func.sum(qt.c.tb2_c)]).group_by(qt.c.u_id)
    

    编写完上面的查询后,我实际上可能会考虑其他选项:

    只需单独执行这两个查询并在Python本身中聚合结果(对于不那么大的结果集)

    鉴于它看起来像某种报告功能而不是业务模型工作流,​​创建一个SQL查询并直接通过它执行engine.(只有当它真的表现得更好)

    2023-02-13 09:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有