【发布时间】:2021-06-01 04:26:23
【问题描述】:
我有一些查询需要迁移到 Ecto,出于可维护性的原因,我宁愿不只是将它们包装在一个片段中,然后就这样结束了。
他们有很多左连接,正如我从this answer 了解到的,Ecto 中的left_join 默认情况下是LEFT OUTER JOIN。我似乎不知道如何向 Ecto 指定我想要一个 LEFT INNER JOIN,这是 Postgresql 中 LEFT JOIN 的默认行为。
看一个玩具示例,假设我们数据库中的帖子可以是匿名的,也可以有创建者。我有一个查询来获取足够的信息来进行帖子预览,但我只想包含非匿名帖子:
SELECT
p.id,
p.title,
p.body,
u.name AS creator_name,
u.avatar AS creator_avatar,
FROM posts p
LEFT JOIN users u ON p.creator_id = u.id;
我会将它翻译成 Ecto:
nonanonymous_posts =
from p in Post,
left_join: u in User, on: p.creator_id == u.id,
select: [p.id, p.title, p.body, u.name, u.avatar]
Ecto 吐了出来
SELECT
t0."id",
t0."title",
t0."body",
t1."name" AS creator_name,
t1."avatar" AS creator_avatar,
FROM "posts" AS t0
LEFT OUTER JOIN "users" as t1 ON t0."creator_id" = t1."id";
这也会回馈匿名帖子。
【问题讨论】:
-
根据doc,JOIN 的默认值是 INNER,但 LEFT JOIN 隐含地是 LEFT OUTER JOIN。似乎没有 LEFT INNER JOIN 这样的东西。如果你想要一个 INNER JOIN,你可以使用
join(或inner_join相同)。
标签: postgresql elixir ecto