2017-03-16 44 views
1

我有一个很长的关联链,连接,排序等,最终从我的一个rails模型中进行选择。在一天结束时,我需要结果是独特的和排序的。我不在乎SELECT语句中使用了哪些列,ORDER BY中出现了什么(这些都是基于用户选择的过滤选项而改变的),我只关心顶层模型/表格查询是唯一的(基于id)。PG :: InvalidColumnReference:错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中

有关背景,widgets是主表,我们正在与widget_steps的加盟,这是Rails 3的(公司正在努力尽快升级,但是这就是他们坚持的时刻是什么)

这里是正在生成的查询和错误:

PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 
LINE 1: ...completed_at" IS NULL)) ORDER BY sequential DESC, widget_s... 
                  ^
: SELECT DISTINCT "widgets".* FROM "widgets" INNER JOIN "widget_steps" ON "widget_steps"."widget_id" = "widgets"."id" INNER JOIN "widget_steps" "active_steps_widgets" ON "active_steps_widgets"."id" = "widgets"."active_widget_step_id" WHERE "widgets"."account_id" = 1 AND "widgets"."completed_at" IS NULL AND (("widgets"."sequential" = 't' AND "widget_steps"."assigned_to" = 5 AND "widget_steps"."id" = "widgets"."active_widget_step_id" AND "widget_steps"."completed_at" IS NULL) OR ("widgets"."sequential" = 'f' AND "widget_steps"."assigned_to" = 5 AND "widget_steps"."completed_at" IS NULL)) ORDER BY sequential DESC, widget_steps.name ASC LIMIT 10 OFFSET 0 
Completed 500 Internal Server Error in 52.3ms 

ActiveRecord::StatementInvalid - PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 
LINE 1: ...completed_at" IS NULL)) ORDER BY sequential DESC, widget_s... 
                  ^
: SELECT DISTINCT "widgets".* FROM "widgets" INNER JOIN "widget_steps" ON "widget_steps"."widget_id" = "widgets"."id" INNER JOIN "widget_steps" "active_steps_widgets" ON "active_steps_widgets"."id" = "widgets"."active_widget_step_id" WHERE "widgets"."account_id" = 1 AND "widgets"."completed_at" IS NULL AND (("widgets"."sequential" = 't' AND "widget_steps"."assigned_to" = 5 AND "widget_steps"."id" = "widgets"."active_widget_step_id" AND "widget_steps"."completed_at" IS NULL) OR ("widgets"."sequential" = 'f' AND "widget_steps"."assigned_to" = 5 AND "widget_steps"."completed_at" IS NULL)) ORDER BY sequential DESC, widget_steps.name ASC LIMIT 10 OFFSET 0: 

这是为什么? postgres认为对此如此含糊不清?为什么像这样的查询在MySQL中总能正常工作,但会导致postgres窒息。

我曾尝试:

  1. 在链
  2. 指定.uniq在链的末端没有做一个自定义的结束指定.select([everything mentioned in the order by]).uniq选择
  3. 编写一些自定义的AREL尝试嵌入所有这在子查询中,然后执行.uniq或.order以外的这个(不能得到这个工作)
  4. 做postgres之外的.uniq(这是因为分页而中断...你可以最终一些页面只有1个或者被删除2项,因为重复的对他们)
+0

什么是'顺序'在这里?是某个桌子或其他东西的列吗? –

+0

它是一个小工具栏 –

+0

想一想:当存在(至少)两行'widget_steps'时,它满足了你单个行的'widget'的条件,哪个'name'应该用在' ORDER BY'? PostgreSQL不会决定这个,而不是你,这就是为什么它说把'widget_steps.name'放入'SELECT'子句(以使这个也是'DISTINCT')。 OFC,MySQL不会用这样的无稽之谈:它允许你运行你想出的任何错误的查询。 – pozs

回答

2

您需要添加widget_steps.name到所选列的列表:

SELECT DISTINCT "widgets".*, "widget_steps.name" FROM "widgets" INNER JOIN "widget_steps" ON "widget_steps"."widget_id" = "widgets"."id" INNER JOIN "widget_steps" "active_steps_widgets" ON "active_steps_widgets"."id" = "widgets"."active_widget_step_id" WHERE "widgets"."account_id" = 1 AND "widgets"."completed_at" IS NULL AND (("widgets"."sequential" = 't' AND "widget_steps"."assigned_to" = 5 AND "widget_steps"."id" = "widgets"."active_widget_step_id" AND "widget_steps"."completed_at" IS NULL) OR ("widgets"."sequential" = 'f' AND "widget_steps"."assigned_to" = 5 AND "widget_steps"."completed_at" IS NULL)) ORDER BY sequential DESC, widget_steps.name ASC LIMIT 10 OFFSET 0 

这不应该改变您的查询的逻辑,将工作精细。

在Rails中你可以使用select方法来设置选定列的列表:

Widget.select('"widgets".*, "widget_steps.name"') 

希望这会有所帮助。

+0

这工作!谢谢! 虽然注意到widget_steps.name不是一件东西 - 不得不使用widgets.name –

相关问题