SQLAlchemy多表关联查询:如何关联表并对列去重求和?
如何用SQLAlchemy实现两表关联查询并对指定列去重求和
现有表结构
Parent表

Child表

预期查询结果

修正后的模型代码
原代码中Parent类的关联关系存在错误,foreign_keys应指向CATEGORY_ID而非ID,修正后代码如下:
from app import db_con from sqlalchemy import ForeignKey from sqlalchemy.dialects import mssql class Parent(db_con.Model): __tablename__ = "parent" ID = db_con.Column( "id", mssql.INTEGER, nullable=False, primary_key=True ) COST = db_con.Column("cost", mssql.DECIMAL) CATEGORY_ID = db_con.Column("category_id", mssql.INTEGER, ForeignKey("child.category_id")) # 修正外键关联字段,确保和Child表正确关联 CATEGORY = db_con.relationship("Child", foreign_keys=[CATEGORY_ID], uselist=False) class Child(db_con.Model): __tablename__ = "child" CATEGORY_ID = db_con.Column("category_id", mssql.INTEGER, nullable=False, primary_key=True) NAME = db_con.Column("name", mssql.NVARCHAR(None))
实现查询的两种方式
方式1:ORM 查询
通过ORM结合聚合函数实现去重求和,按分类名称分组:
from sqlalchemy import func # 关联两表,按分类名称分组,对COST列去重后求和 result = db_con.session.query( Child.NAME, func.sum(func.distinct(Parent.COST)).label("total_cost") ).join(Parent, Parent.CATEGORY_ID == Child.CATEGORY_ID).group_by(Child.NAME).all() # 遍历输出结果 for category_name, total in result: print(f"分类: {category_name}, 去重总成本: {total}")
方式2:Core 查询
直接使用SQLAlchemy Core语法实现:
from sqlalchemy import select, func parent_table = Parent.__table__ child_table = Child.__table__ query = select( child_table.c.NAME, func.sum(func.distinct(parent_table.c.COST)).label("total_cost") ).join(parent_table, parent_table.c.CATEGORY_ID == child_table.c.CATEGORY_ID).group_by(child_table.c.NAME) result = db_con.session.execute(query).fetchall() # 处理结果 for row in result: print(f"分类: {row.NAME}, 去重总成本: {row.total_cost}")
关键说明
func.distinct(Parent.COST):实现同一分组内对COST值去重,避免重复计算join:通过CATEGORY_ID关联两张表,确保数据对应关系正确group_by(Child.NAME):按分类名称聚合,最终得到每个分类的去重求和结果
内容的提问来源于stack exchange,提问作者blackknight
相关产品推荐
相关产品推荐

