【问题标题】:rails missing FROM-clause entry for table (counting children)rails 缺少表的 FROM 子句条目(计算子项)
【发布时间】:2015-07-14 00:21:00
【问题描述】:

我有一个简单的 parent has_many children 关系,我试图让所有孩子少于 n 个的父母。

Parent.select("parents.id").joins(:children).group('parents.id').having('COUNT(children.id) < ?', n).reorder('parents.id')

不断出现的错误是:

SELECT parents.id FROM "parents" INNER JOIN "children" ON "children"."parent_id" = "parents"."id" GROUP BY parents.id HAVING count("children"."id") < 100
PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "children"

根据我在网上阅读的内容,这应该可以工作。我已经搜索了许多带有相关问题的帖子,但似乎没有一个答案是相关的。排序的父子关系有一个范围,这就是我按父 ID 重新排序的原因。

我需要什么“FROM-clause”条目?

运行 Rails 4.2 和 Postgres

【问题讨论】:

  • 如果在 PgAdminpsql 中运行原始 SQL 会发生什么?它有效还是你得到同样的错误? children 表是否肯定同时具有 parent_idid 列?
  • 我的 psql 中出现同样的错误。我确认children 确实有parent_idid 列。

标签: ruby-on-rails postgresql


【解决方案1】:

我认为这里的问题是您的 HAVING 子句引用了一些东西 -- children.id -- 在您的 SELECT 中不存在。 HAVINGGROUP BYSELECT 之后进行评估,所以我相信它目前可用的只是parents.id

有关详细信息,请参阅SELECT doc

因此,最终,您需要从 SELECT 获得子 ID 计数,然后才能在其上调用 HAVING

想到同时完成这两件事的一种方法是将count用作窗口函数

然后 SQL 会看起来像这样:

SELECT parents.id, count(children.id) over(partition by children.id) as children_id_count
FROM "parents"
INNER JOIN "children" ON "children"."parent_id" = "parents"."id"
WHERE count(children.id) over(partition by children.id) < 100
GROUP BY parents.id

注意:窗口函数需要在WHERE子句中重复,因为此时别名尚未创建。

AFAIK,Active Record 本身并不支持 窗口函数,因此您需要为此使用原始 SQL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多