gpt4 book ai didi

python - 排除连接表中没有关联行的行

转载 作者:行者123 更新时间:2023-11-28 22:21:39 25 4
gpt4 key购买 nike

我想获取在 bar 中没有引用的表 foo 的实例(行)

foo:

+----+-----+
| id | baz |
+----+-----+
| 1 | 23 |
| 2 | 56 |
| 3 | 45 |
| 4 | 78 |
+----+-----+

表格:

+-----+--------+-----+
| id | foo_id | zab |
+-----+--------+-----+
| 7 | 2 | s1 |
| 8 | 4 | s2 |
+-----+--------+-----+

我的查询结果应该是 foo 的实例,如下所示:

+----+-----+
| id | baz |
+----+-----+
| 1 | 23 |
| 3 | 45 |
+----+-----+

使用 SQLAlchemy ORM,我尝试了 joinouterjoin,但解决方案仍然在逃避我。有些事情告诉我,解决方案很简单,而且就在我面前...

q = db.session.query(Foo).join(Baz, Baz.foo_id == Foo.id)

q = db.session.query(Foo).outerjoin(Baz, Baz.foo_id == Foo.id)

最佳答案

您要查找的 SQL 查询是这样的:

SELECT foo.* FROM foo LEFT JOIN bar ON bar.foo_id = foo.id WHERE bar.foo_id IS NULL;

LEFT JOIN,与 INNER JOIN 不同,包括“左”表(即 中指定的表)中的所有行>FROM tblname),即使它们在“正确的”表(JOIN tblname 中指定的表)中没有关联行。这意味着右表中没有关联行的行将具有 NULL 值:

foo.id | foo.baz | bar.id | bar.foo_id | bar.zab
-------+---------+--------+------------+--------
1 | 23 | NULL | NULL | NULL
2 | 56 | 7 | 2 | s1

因此,过滤那些在右表的主键中具有 NULL 的行(在任何其他情况下不能为空,而右表中的其他列可以),并且你得到 foo 没有关联 bar 的行。

在 SQLAlchemy 中,变成这样:

q = db.session.query(Foo).join(Bar, isouter=True).filter(Bar.id == None)

用于joinisouter=True 标志是how you do a LEFT JOIN使用 SQLAlchemy。

关于python - 排除连接表中没有关联行的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48216520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com