在squeel中的嵌套查询[英] Nested query in squeel

本文是小编为大家收集整理的关于在squeel中的嵌套查询的处理方法,想解了在squeel中的嵌套查询的问题怎么解决?在squeel中的嵌套查询问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

短版:如何在 squeel 中编写此查询?

SELECT OneTable.*, my_count
FROM   OneTable JOIN (
  SELECT DISTINCT one_id, count(*) AS my_count
  FROM   AnotherTable
  GROUP BY one_id
) counts
ON OneTable.id=counts.one_id
<小时>

长版:rocket_tag 是一个为模型添加简单标记的 gem.它添加了一个方法tagged_with.假设我的模型是 User,带有 id 和名称,我可以调用 User.tagged_with ['admin','sales'].在内部它使用这个 squeel 代码:

select{count(~id).as(tags_count)}
.select("#{self.table_name}.*").
joins{tags}.
where{tags.name.in(my{tags_list})}.
group{~id}

生成此查询:

SELECT count(users.id) AS tags_count, users.*
  FROM users INNER JOIN taggings
    ON taggings.taggable_id = users.id
   AND taggings.taggable_type = 'User'
  INNER JOIN tags
    ON tags.id = taggings.tag_id
  WHERE tags.name IN ('admin','sales')
  GROUP BY users.id

一些 RDBMS 对此感到满意,但 postgres 抱怨:

ERROR: column "users.name" must appear in the GROUP BY
clause or be used in an aggregate function

我认为编写查询的更合适的方式是:

SELECT users.*, tags_count FROM users INNER JOIN (
  SELECT DISTINCT taggable_id, count(*) AS tags_count
    FROM taggings INNER JOIN tags
      ON tags.id = taggings.tag_id
    WHERE tags.name IN ('admin','sales')
    GROUP BY taggable_id
  ) tag_counts
  ON users.id = tag_counts.taggable_id

有什么方法可以用 squeel 来表达吗?

推荐答案

我不知道 Squeel,但是你看到的错误可以通过升级 PostgreSQL 来修复.

<块引用>

一些 RDBMS 对此感到满意,但 postgres 抱怨:

错误:列"users.name"必须出现在 GROUP BY 子句中,否则在聚合函数中使用

从 PostgreSQL 9.1 开始,在 GROUP BY 中列出主键后,您可以跳过该表的其他列,并在 SELECT 列表中仍然使用它们.9.1 版发行说明告诉我们:p><块引用>

当primary时允许查询目标列表中的非GROUP BY列key 在 GROUP BY 子句中指定

<小时>

顺便说一句,您的替代查询可以简化,额外的 DISTINCT 将是多余的.

SELECT o.*, c.my_count
FROM   onetable o
JOIN (
  SELECT one_id, count(*) AS my_count
  FROM   anothertable
  GROUP  BY one_id
) c ON o.id = counts.one_id

本文地址:https://www.itbaoku.cn/post/1764026.html