SQLAlchemy中的嵌套连接

6 投票
1 回答
3926 浏览
提问于 2025-04-18 18:37

我该如何在SQLAlchemy中进行嵌套连接?我想运行的语句是

SELECT a.col1, a.col2, c.col3 
FROM a
LEFT OUTER JOIN (b INNER JOIN c ON c.col4 = b.col4) ON b.col5 = a.col5

我需要显示所有在A中的记录,但只与那些可以与C连接的B中的记录进行连接。

我目前的代码是

session.query(a.col1, a.col2, c.col3).outerjoin(b, b.col5 == a.col5).all()

这段代码基本上满足了我的需求,A中的记录在缺少B记录时会显示为null值;不过,太多的B记录被包含进来了,我需要限制一下它们的数量。但是,如果我只是再加一个连接,比如说,

session.query(a.col1, a.col2, c.col3).outerjoin(b, b.col5 == a.col5).join(c, b.col4 == c.col4).all()

这样的话,所有在B中值为null的A记录就会被排除掉。

我得说明一下,我不能直接将AC连接,因为它们之间唯一的联系是通过B

1 个回答

4

这可以通过使用 subquery 来最简单地实现:

subq = (session.query(b.col5).join(c, c.col4 == b.col4)).subquery("subq")
qry = session.query(a).outerjoin(subq, a.col5 == subq.c.col5)
print(qry)

如果你能多展示一些模型的定义,特别是表之间关系的性质,可能会有更优雅的解决方案。

撰写回答