Flask SQLAlchemy 单次查询两张表匹配name字段数据 避免join重复结果
Flask+SQLAlchemy 多表同条件查询避免笛卡尔积方案
问题根源
你使用JOIN出现笛卡尔积的核心原因是JOIN为横向字段拼接,当同一name在A表存在m条匹配记录、B表存在n条匹配记录时,JOIN会返回m*n条组合结果,和你需要的纵向独立返回两张表匹配记录的需求不符。
解决方案
使用UNION ALL纵向合并两个独立查询的结果集即可,要求两个查询返回的字段数量、字段类型完全对应。
示例模型定义
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class A(db.Model): id = db.Column(db.Integer, primary_key=True) value = db.Column(db.Integer) name = db.Column(db.String(50)) class B(db.Model): id = db.Column(db.Integer, primary_key=True) pass = db.Column(db.String(10)) name = db.Column(db.String(50))
查询代码实现
from sqlalchemy import union_all target_name = "first_name" # 构造A表查询,增加来源标识字段,返回字段数量、类型和B表查询对齐 query_a = db.session.query( db.literal("A").label("source"), A.id.label("record_id") ).filter(A.name == target_name) # 构造B表查询,结构和A表查询完全一致 query_b = db.session.query( db.literal("B").label("source"), B.id.label("record_id") ).filter(B.name == target_name) # 合并两个查询并获取结果 combined_result = db.session.execute(union_all(query_a, query_b)).all()
结果遍历输出
for row in combined_result: print(f"<{row.source} {row.record_id}>")
输出结果完全符合你的要求:
<A 1> <B 1>
扩展说明
如果需要返回两张表的其他业务字段,只要保证两个查询对应位置的字段类型匹配即可,多余的字段可以用db.null()填充保证两边字段数量一致。
内容的提问来源于stack exchange,提问作者Gargo
相关产品推荐
相关产品推荐

