You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy多表关联查询:如何关联表并对列去重求和?

如何用SQLAlchemy实现两表关联查询并对指定列去重求和

现有表结构

Parent表

Parent表示意图

Child表

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:05:27