如何反转连接顺序以使用子查询与 sqlalchemy 正确连接?
How can I reverse the join order to get a right join with sqlalchemy using a subquery?
我正在尝试使用 Flask-SQLAlchemy ORM
创建以下(非常简化)SQL 语句
SELECT TableA.attr
FROM (SELECT DISTINCT TableB.a_id FROM TableB) AS TableB
LEFT JOIN TableA
ON TableA.id = TableB.a_id
为了实现这一点,我使用了以下 SQLAlchemy 语句
sq = db.session.query(distinct(TableB.a_id).label('a_id')).subquery()
results = db.session.query(TableA.attr).join(sq, sq.c.a_id==TableA.id, isouter=True).all()
然而,这不是将我的子查询 TableB(左)与 TableA(右)连接起来,而是相反,将 TableA 与 TableB 连接起来。
SELECT TableA.attr
FROM TableA
LEFT JOIN (SELECT DISTINCT TableB.a_id FROM TableB) AS TableB
ON TableB.a_id = TableA.id
因为我知道 SQLAlchemy 没有正确的连接,所以我必须以某种方式颠倒顺序,同时仍然得到 TableA.attr 作为结果,我无法弄清楚如何使用子查询做到这一点。
问题的答案确实是 select_from() 方法。 IE。我的问题的实际解决方案是以下语句:
sq = db.session.query(distinct(TableB.a_id).label('a_id')).subquery()
results = db.session.query(TableA.attr) \
.select_from(sq) \
.join(TableA, TableA.id==sq.c.a_id, isouter=True).all()
一般而言:select_from() 方法获取连接的左侧部分。 join() 获取正确的部分作为其第一个参数。
我正在尝试使用 Flask-SQLAlchemy ORM
创建以下(非常简化)SQL 语句SELECT TableA.attr
FROM (SELECT DISTINCT TableB.a_id FROM TableB) AS TableB
LEFT JOIN TableA
ON TableA.id = TableB.a_id
为了实现这一点,我使用了以下 SQLAlchemy 语句
sq = db.session.query(distinct(TableB.a_id).label('a_id')).subquery()
results = db.session.query(TableA.attr).join(sq, sq.c.a_id==TableA.id, isouter=True).all()
然而,这不是将我的子查询 TableB(左)与 TableA(右)连接起来,而是相反,将 TableA 与 TableB 连接起来。
SELECT TableA.attr
FROM TableA
LEFT JOIN (SELECT DISTINCT TableB.a_id FROM TableB) AS TableB
ON TableB.a_id = TableA.id
因为我知道 SQLAlchemy 没有正确的连接,所以我必须以某种方式颠倒顺序,同时仍然得到 TableA.attr 作为结果,我无法弄清楚如何使用子查询做到这一点。
问题的答案确实是 select_from() 方法。 IE。我的问题的实际解决方案是以下语句:
sq = db.session.query(distinct(TableB.a_id).label('a_id')).subquery()
results = db.session.query(TableA.attr) \
.select_from(sq) \
.join(TableA, TableA.id==sq.c.a_id, isouter=True).all()
一般而言:select_from() 方法获取连接的左侧部分。 join() 获取正确的部分作为其第一个参数。