加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 08:53:22 所属栏目:MsSql教程 来源:网络整理
导读:所以我的数据库包含一个项目列表: items: item.id | item.title 我有一个第二个表,它将许多标签与项目相关联: tags: tag.id | item.id 项目可以具有与其相关联的若干标签(例如,5,20和25),因此对于标签表格中的每个标签值将具有一行. 我希望能够确定特定标记
所以我的数据库包含一个项目列表:
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)

(我看到this post about how you can’t SELECT an AS-named column with ARRAY_AGG)

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

思考?

解决方法

事实证明,Postgres的 ANY keyword是双面的,不能对称使用.

因此工作代码是:

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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读