SQLAlchemy中的嵌套连接
我该如何在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
记录就会被排除掉。
我得说明一下,我不能直接将A
与C
连接,因为它们之间唯一的联系是通过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)
如果你能多展示一些模型的定义,特别是表之间关系的性质,可能会有更优雅的解决方案。