Python sqlalchemy和双外套
我需要在下面的两个表A和B上进行双重外部联接,以得到显示的结果 使用SQLAlchemy ORM或SQL表达式 表B应该进行两次外部联接,以获得联接的两个结果集(由c_id区分),它们用于相同的A记录。外部联接用于获取在第一个(c_id=66)或第二个(c_id=70)外部联接中缺少B个结果的空值 一张桌子:Python sqlalchemy和双外套,python,sqlalchemy,outer-join,Python,Sqlalchemy,Outer Join,我需要在下面的两个表A和B上进行双重外部联接,以得到显示的结果 使用SQLAlchemy ORM或SQL表达式 表B应该进行两次外部联接,以获得联接的两个结果集(由c_id区分),它们用于相同的A记录。外部联接用于获取在第一个(c_id=66)或第二个(c_id=70)外部联接中缺少B个结果的空值 一张桌子: id -- 1 2 3 4 B表: id | a_id | c_id ---+------+------ 1 | 1 | 66 2 | 2 | 66 3 | 3
id
--
1
2
3
4
B表:
id | a_id | c_id
---+------+------
1 | 1 | 66
2 | 2 | 66
3 | 3 | 70
4 | 4 | 66
5 | 4 | 70
查询结果应为:
a_id | b1_id (66) | b2_id (70)
-----+------------+-----------
1 | 1 | NULL
2 | 2 | NULL
3 | NULL | 3
4 | 4 | 5
我已经到了适当的原始SQL查询如下所示的地步:
SELECT
A.id AS a_id,
B_1.id AS b1_id,
B_2.id AS b2_id,
FROM
A
LEFT OUTER JOIN B AS B_1 ON A.id = B_1.a_id AND B_1.c_id = 66
LEFT OUTER JOIN B AS B_2 ON A.id = B_2.a_id AND B_2.c_id = 70
WHERE
B_1.id is not NULL or
B_2.id is not NULL;
现在,您知道如何在SA ORM或SA SQL表达式中对其进行编码吗?我自己找到了解决方案:
b1 = aliased(B)
b2 = aliased(B)
q = session.query(A.id, b1.id.label("b1_id"), b1.id.label("b2_id"))
q = q.outerjoin(b1, sqlalchemy.and_(A.id == b1.a_id, b1.c_id == 66))
q = q.outerjoin(b2, sqlalchemy.and_(A.id == b2.a_id, b2.c_id == 70))
q = q.filter(sqlalchemy.or_(b1.id != None, b2.id != None))