当前位置: 首页 > 面试题库 >

Postgres:使用ARRAY_AGG和HAVING(而不是WHERE)过滤结果

诸葛嘉熙
2023-03-14
问题内容

因此,我的数据库包含项目清单:

items:  item.id | item.title

我还有第二张表,该表将一些标签与项目相关联:

tags:  tag.id | item.id

一个项目可能具有与之关联的几个标签(例如5、20和25),因此对于标签表中的每个标签值都有一行。

我希望能够确定某个特定标签是否与某个商品相关联,而又不会丢失所有其他标签数据。例如,

SELECT items.id, items.title
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
WHERE tag.id =27

不起作用,因为它消除了包含其他标记值的行(如果tag.id为27,则它不能是特定行上的任何其他值)。

为了解决这个问题,我想使用ARRAY_AGG将各个标签号汇总到一个数组中,我可以(应该)轻松地测试其成员资格值。

SELECT items.id, items.title
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
GROUP BY items.id
HAVING ANY(ARRAY_AGG(tags.tag_id)=27)

但是上面的代码在HAVING子句的ANY部分上产生语法错误。

有什么想法吗?


问题答案:

事实证明Postgres的ANY关键字是支持关键字的,不能对称使用。

因此,工作代码为:

SELECT items.id, items.title, ARRAY_AGG(tags.tag_id)
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
GROUP BY items.id
HAVING 27 = ANY(ARRAY_AGG(tags.tag_id))


 类似资料:
  • 问题内容: 在SQL(MSSQL,Oracle等)中,在联接表时,向JOIN语句添加过滤器而不是在WHERE子句中添加过滤器有什么好处? IE 相对 我意识到这并非在所有情况下都有效,但是我注意到在某些情况下,通过将过滤器条件放在JOIN语句中似乎可以提高性能。但是,由于它是JOIN语句的一部分,因此也会使它的行为有些奇怪。 有什么想法吗? 问题答案: 对于查询,这些过滤器的性能特征将取决于许多因

  • 本文向大家介绍SQL 使用HAVING子句过滤GROUP BY结果,包括了SQL 使用HAVING子句过滤GROUP BY结果的使用技巧和注意事项,需要的朋友参考一下 示例 HAVING子句过滤GROUP BY表达式的结果。注意:以下示例使用的是Library示例数据库。 例子: 返回写了不止一本书的所有作者(在线示例)。 返回作者超过三名的所有书籍(实时示例)。            

  • 问题内容: 我正在尝试使用一个简单的已提交字段在MySQL中获取记录。更准确地说,用户输入名称(名字或姓氏或全名),服务器应返回匹配的行。 到目前为止,我正在做的事情是这样的: 暂时可以正常工作,但是(显然)当用户提交全名时,该方法将无法正常工作。有没有办法在整个“ WHERE类型条件”和“ HAVING类型条件”之间添加OR?这样,我可以做类似的事情: 我知道我可以拆分原始字符串,但这会产生一些

  • 问题内容: 我正在使用AngularJS,它很棒。我在文档中找不到它-Java语言中与此AngularJS表达式等效的功能是什么: 谢谢您的帮助。 问题答案: 它在Angular的过滤器文档中: 在HTML模板绑定中 {{filter_expression | filter:expression}} 在JavaScript中 $ filter(’filter’)(数组,表达式) 在您的情况下,它看

  • 因为普罗米修斯topk返回的结果比预期的要多,而且因为https://github.com/prometheus/prometheus/issues/586需要客户端处理,而这些处理尚未通过https://github.com/grafana/grafana/issues/7664提供,所以我正在尝试对我的类似问题进行不同的近期解决方案。 在我的特殊情况下,我想要绘制的大多数度量值在大多数情况下都

  • 本文向大家介绍SQL中where和having的区别详解,包括了SQL中where和having的区别详解的使用技巧和注意事项,需要的朋友参考一下 概念 where where是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,再返回结果前起作用,并且where后不能使用“聚合函数”。 聚合函数 对一组值执行计算,并返回单个值,也被称为组函数,经常与 SELECT 语句的 GR