Ecto, ГДЕ В подзапросе

#sql #subquery #elixir #ecto

Вопрос:

Это мой подзапрос (он всегда будет возвращать одну запись из-за предложения where):

 subset = 
from(a in "table1", where: a. id == ^parameter, select: [a.special_id1, a.special_id2, a.special_id3])
 

Это мой основной вопрос:

 from(b in "table2", where: b.id in subquery(subset), select: [:first_name, :last_name]
 

Получение этой ошибки:

** (Ecto.QueryError) подзапрос должен возвращать одно поле, чтобы его можно было использовать в правой части in запроса:

Я понимаю, почему подзапрос вернет такую структуру [[special_id1, special_id2...]] . Я хочу, чтобы подзапрос возвращал только плоский список. Как я могу этого достичь?

Ответ №1:

Ты не можешь. Однако вы можете использовать exists/1 запрос с подзапросом, который будет соответствовать родительскому полю:

 subset = 
  from(a in "table1",
    where: a.id == ^parameter,
    where: parent_as(:table2).id in [a.special_id1, a.special_id2, a.special_id3],
    select: 1)

from(b in "table2", as: :table2,
  where: exists(subquery(subset)),
  select: [:first_name, :last_name])
 

Это должно предоставить вам запрос, который вы ищете.