【问题标题】:Postgrex - query returning an ambiguous column reference errorPostgrex - 查询返回不明确的列引用错误
【发布时间】:2019-05-21 07:00:26
【问题描述】:

我有以下疑问:

def user_contacts(provider_id, filter) do
  query =
    from(
      u in User,
      preload: [:groups],
      where: u.provider_id == ^provider_id and u.type != "company"
    )

  query
  |> filter_sector(filter)
  |> filter_availability(filter)
end

defp filter_sector(query, %{"sector" => "Asset Management & Investment Funds"}) do
  query
  |> join(:inner, [u], p in Profile, p.user_id == u.id)
  |> where([u, p], fragment("(sectors->>'asset' = ?)", "true"))
end

defp filter_sector(query, _), do: query

defp filter_availability(query, %{"availability" => "now"}) do
  query
  |> join(:inner, [u], p in Profile, p.user_id == u.id)
  |> where([u, p], ^Date.utc_today >= p.placement_availability)
end

defp filter_availability(query, _), do: query

我收到以下错误: ERROR 42702 (ambiguous_column): column reference "sectors" is ambiguoussectorsProfile 中的嵌入模式。

我尝试通过将filter_sector 查询的结构改写为:

from(
  q in query,
  join: p in Profile,
  on: p.user_id == q.id,
  where: fragment("(sectors->>'asset' = ?)", "true")
)

但我仍然遇到同样的错误。奇怪的是,当过滤器只有一个“扇区”值或一个“可用性”值时,查询可以工作,但是当两个值都存在时,就会出现错误。

【问题讨论】:

    标签: elixir ecto postgrex


    【解决方案1】:

    如果不查看整个查询,我只能推测,但您可能在该联接中有另一个表,上面有一个 sectors 字段。或者,个人资料可能会被加入两次。如果您包含完整的错误消息、堆栈跟踪以及生成的查询,将有助于确认这一怀疑。

    如果是这种情况,您可以通过完全限定 sectors 字段来修复它,这是编写查询的首选方式:

    query
    |> join(:inner, [u], p in Profile, p.user_id == u.id)
    |> where([u, p], fragment("(?->>'asset' = ?)", p.sectors, "true"))
    

    现在应该没有歧义了。

    【讨论】:

      猜你喜欢
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多