2017-02-04 10 views
1

Для следующего запроса:Ecto.QueryError на подзапроса

sub_query = from sq in Database.Nestoria, 
    distinct: sq.lister_url, 
    select: [sq.place_name, 
      sq.price, 
      sq.price_type], 
    where: fragment("cast(to_char(?, 'YYYYMMDD') AS INTEGER) >= (SELECT cast(to_char(max(inserted_at), 'YYYYMMDD') AS INTEGER) - 1 FROM nestoria)", sq.inserted_at), 
    where: sq.bedroom_number == 1 

query = from un in Database.Underground, 
    left_join: ne in subquery(sub_query), on: un.station_name_slug == ne.place_name, 
    select: [ un.lines_id, 
      un.station_name, 
      un.display_name, 
      ne.place_name, 
      fragment("count(?) as data_count", ne.place_name), 
      fragment("Avg(CASE WHEN ? = 'weekly' THEN price * (31/7) ELSE price END) AS avg_monthly_price ", ne.price_type)], 
    group_by: [un.lines_id, 
      un.station_name, 
      un.display_name, 
      ne.place_name], 
    order_by: [ne.place_name] 

output = Repo.all(query) 

Я получаю ошибку ниже:

** (Ecto.QueryError) subquery must select a source (t), a field (t.field) or a map, got: [&0.place_name(), &0.price(), &0.price_type()]

Странная вещь У меня есть это работает в очень похожий проект без проблем. Все схемы работают правильно без каких-либо проблем (Repo.all (Nestoria/Underground) возвращает штраф).

+0

Попробуйте 'select: [: place_name,: price,: price_t ype] 'вместо' select: [sq.place_name, ...] '. – Dogbert

+0

Это исправление очень понравилось. Как получается, что оригинальный способ не сработал? – clery00

ответ

3

Начиная с текущей версии подзапросов Ecto не может быть select со списком в качестве значения. Даже если это как-то сработало, вы не сможете сделать ne.place_name в запросе в вопросе, так как ne будет списком, а не картой.

Вы можете либо выбрать карту вручную:

select: %{place_name: sq.place_name, price: sq.price, ...} 

или использовать map или struct:

select: map(sq, [:place_name, :price, :price_type]) 
# or 
select: struct(sq, [:place_name, :price, :price_type]) 

или просто передать список полей, которое эквивалентно struct версии выше:

select: [:place_name, :price, :price_type] 

 Смежные вопросы

  • Нет связанных вопросов^_^