我有两个表 beard
和 moustache
定义如下:
+--------+---------+------------+-------------+
| person | beardID | beardStyle | beardLength |
+--------+---------+------------+-------------+
+--------+-------------+----------------+
| person | moustacheID | moustacheStyle |
+--------+-------------+----------------+
我在 PostgreSQL 中创建了一个 SQL 查询,它将合并这两个表并生成以下结果:
+--------+---------+------------+-------------+-------------+----------------+
| person | beardID | beardStyle | beardLength | moustacheID | moustacheStyle |
+--------+---------+------------+-------------+-------------+----------------+
| bob | 1 | rasputin | 1 | | |
+--------+---------+------------+-------------+-------------+----------------+
| bob | 2 | samson | 12 | | |
+--------+---------+------------+-------------+-------------+----------------+
| bob | | | | 1 | fu manchu |
+--------+---------+------------+-------------+-------------+----------------+
查询:
SELECT * FROM beards LEFT OUTER JOIN mustaches ON (false) WHERE person = "bob"
UNION ALL
SELECT * FROM beards b RIGHT OUTER JOIN mustaches ON (false) WHERE person = "bob"
但是我无法创建它的 SQLAlchemy 表示。我尝试了从实现 from_statement
到 outerjoin
的几种方法,但都没有真正奏效。谁能帮我解决这个问题?
最佳答案
在 SQL 中,A RIGHT OUTER JOIN B
等同于 B LEFT OUTER JOIN A
。因此,从技术上讲,RIGHT OUTER JOIN
API 中没有必要 - 可以通过切换目标“可选”和加入“可选”的位置来实现相同的目的。 SQL Alchemy 为此提供了一个 API:
# this **fictional** API:
query(A).join(B, right_outer_join=True) # right_outer_join doesn't exist in SQLA!
# can be implemented in SQLA like this:
query(A).select_entity_from(B).join(A, isouter=True)
参见 SQLA Query.join() doc ,部分“控制加入的内容”。
关于python - SQLAlchemy 中的右外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11400307/