【发布时间】:2015-02-23 23:06:26
【问题描述】:
在 Postgres 中,有没有办法在由联结表链接的表之间执行left join,并对链接表进行一些过滤?
假设我有两个表,humans 和 pets,我想执行一个查询,其中包含人类 ID 和宠物名称。如果人类 ID 存在,但他们没有同名的宠物,我仍然希望返回人类的行。
如果我的 FK 关系从 pets 到 humans,这将起作用:
select h.*, p.*
from humans as h
left join pets as p on p.human_id = h.id and p.name = 'fluffy'
where h.id = 13
我会得到一行人类 13 的详细信息和蓬松的价值观。此外,如果人类 13 没有名为“蓬松”的宠物,我将得到一行包含人类 13 的值,而宠物列的值为空。
但是,我没有直接的 FK 关系,我在 humans 和 pets 之间有一个联结表,所以我正在尝试这样的查询:
select h.*, p.*
from humans as h
left join humans_pets_junction as j on j.human_id = h.id
left join pets as p on j.pet_id = p.id and p.name = 'fluffy'
where h.id = 13
返回人类 13 的所有宠物的行,除了 fluffy 的行之外,其他列都是空的。
如果我将 p.name = 'fluffy' 添加到 WHERE 子句中,这会过滤掉所有空行,但也意味着如果人类 13 根本没有名为 fluffy 的宠物,我会得到 0 行。
有没有办法复制 FK 样式 left join 的行为,但与联结表一起使用时?
【问题讨论】:
-
您的意思是第二个查询中的
select h.*, p.*,对吧? -
我冒昧地修正了假定的错字。
标签: sql database postgresql many-to-many left-join