我尝试使用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或聊天中的子查询一起使用
答案 0 :(得分:2)
如Ecto.Query.API.in/2
文档所述:
右侧可能是列表,文字列表甚至是数据库中具有数组类型的列。
也就是说,in
子句的右侧不能是查询。最简单的解决方案是首先使用sub
从Repo.all(sub)
获取实际列表,然后使用此列表。这样会导致1个额外的查询,恕我直言是可以接受的。
另一种解决方案是,如果后面的数据库允许fragment
和in
语句一起使用,则使用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()] )