如何在in中使用子查询?

时间:2018-11-26 08:17:47

标签: elixir ecto

我尝试使用in (subquery)

创建查询
sub = from(
    d in Deffered,
    select: d."ИД Категории",
    distinct: true,
    where:
      d.date_change >= ^date and d.deleted != true 
      and fragment("md5(Исполнитель) = ?", ^hash)
  )
from(
    a in Answered,
    select: {count(a."Номер")},
    where: a.answer_date >= ^date
    and a.deleted != true
    and fragment("md5(Исполнитель) = ?", ^hash)
    and a."ИД Категории" not in ^sub
  )|>Repo.all()

抛出错误:

  不能强制转换#Ecto.Query<from d in Dobrobot.Deffered, where: d.date_change = ^"2018-11-19 00:00:00" and d.deleted != true and fragment("md5(Исполнитель) = ?", ^"6634F0A9A3C5EB7D97FBA08C1F08A45D"), distinct: true, select: d."ИД Категории">中的

where   键入{:in,:integer}

我找不到答案如何将not in与Google或聊天中的子查询一起使用

2 个答案:

答案 0 :(得分:2)

Ecto.Query.API.in/2文档所述:

  

右侧可能是列表,文字列表甚至是数据库中具有数组类型的列。

也就是说,in子句的右侧不能是查询。最简单的解决方案是首先使用subRepo.all(sub)获取实际列表,然后使用此列表。这样会导致1个额外的查询,恕我直言是可以接受的。

另一种解决方案是,如果后面的数据库允许fragmentin语句一起使用,则使用SELECT


此引用也可能shed a light

答案 1 :(得分:0)

我不确定什么时候更改了,但是现在有可能:

    and a."ИД Категории" not in subquery(sub)

请注意,sub是用 {em> Ecto.Query.subquery/2包装,而没有是用^(pin)运算符包装的。

Ecto.Query.API.in/2尚未记录(但),但记录了 documented for Ecto.Query.subquery/2

...作为条件:

subset = from(p in subset, select: p.id)
Repo.update_all(
  from(p in Post, where: p.id in subquery(subset)),
  set: [sync_started_at: NaiveDateTime.utc_now()]
)