我在下面定义了两个表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
的几种方法,但没有一种真正起作用。有人能帮我吗?
从@Francis P的suggestion中,我想到了这个片段:
不过,这是可行的,但你不能称之为一个答案,因为它似乎是一个黑客。这是sqlalchemy中应该有
RIGHT OUTER JOIN
的另一个原因。以下是我的作品,ORM风格:
它似乎是独立工作的,但似乎不可能与另一个选定的表达式结合起来
在SQL中,
A RIGHT OUTER JOIN B
等同于B LEFT OUTER JOIN A
。因此,从技术上讲,不需要在RIGHT OUTER JOIN
API中——通过切换目标的位置“selectable”和连接的位置“selectable”,也可以做到这一点。SQL炼金术为此提供了一个API:请参阅SQLAQuery.join() doc,控制从“加入什么”部分。
相关问题 更多 >
编程相关推荐