我有一个简单的父母has_many孩子的关系,我正在努力让所有父母少于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
答案 0 :(得分:0)
我认为这里的问题是您的HAVING
子句引用了某些内容 - children.id
- 这在SELECT
中不存在。在HAVING
和GROUP BY
之后评估SELECT
,因此我相信它目前可用的内容仅为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 。