【问题标题】:Convert LEFT JOIN query to Ecto将 LEFT JOIN 查询转换为 Ecto
【发布时间】: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


【解决方案1】:

没有LEFT INNER JOIN 这样的东西。只有INNER JOINLEFT [OUTER] JOINOUTER 部分是可选的,因为LEFT JOIN 必须是外连接)。所以你想要的只是 Ecto 查询中的 :join:inner_join

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多