Ecto中的所有查询

时间:2016-12-25 16:56:49

标签: postgresql elixir ecto

我需要将以下SQL转换为Ecto Query DSL。

SELECT otc.*
FROM users u
INNER JOIN one_time_codes otc ON u.id = otc.user_id
LEFT OUTER JOIN one_time_code_invalidations otci ON otci.one_time_code_id = otc.id
WHERE u.id = 3 AND
      otc.code = 482693 AND
      otci.inserted_at IS NULL AND
      otc.inserted_at > all(SELECT otc.inserted_at
                            FROM one_time_codes otc2
                            WHERE otc2.user_id = 3) AND
      otc.inserted_at > (now() - '180 seconds'::interval);

AND子句的第三个WHERE语句中,请注意有ALL个查询。 Ecto似乎在Ecto.Query.API中没有相应的功能。

如何应用此类聚合?实现这一点的正确方法是什么,虽然可以通过查找Ecto的调试日志来实现,但您有其他想法(或建议)吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

Ecto不允许在表达式中使用子查询,并且您在Ecto的查询API中没有all,但您可以使用fragment这样的:

where: ...
  and otc.inserted_at > fragment("all(SELECT otc.inserted_at FROM one_time_codes otc2 WHERE otc2.user_id = ?", 3)
  and ...