【发布时间】:2023-04-04 22:05:01
【问题描述】:
我正在尝试编写一个能够检查聚合数据范围内是否存在某个数据的 SQL 查询,我在查询中使用ARRAY_AGG 函数。
架构如下所示:
Schema Browser
----------------------------
+ post (TABLE)
postid int4(10)
name varchar(5)
+ posttag (TABLE)
posttagid int4(10)
postid int4(10)
tagid int4(10)
+ tag (TABLE)
tagid int4(10)
name varchar(20)
这是我使用ARRAY_AGG 获取所有带有标签的帖子的查询:
SELECT * FROM post,
LATERAL (
SELECT
ARRAY_AGG( DISTINCT tag.name ) AS tags
FROM tag, posttag
WHERE post.postid = posttag.postid
AND posttag.tagid = tag.tagid
) posts
问题是当我尝试使用标签过滤器时!例如,我想获取所有包含“node”和“test”标签的帖子。假设“test”标签的 id 为 1,而“node”标签的 id 为 2。所以我正在尝试IN 像这样的tag.tagid IN (1, 2) 条件,这就是我将如何在查询中添加 where 条件:
SELECT * FROM post,
LATERAL (
SELECT
ARRAY_AGG( DISTINCT tag.name ) AS tags
FROM tag, posttag
WHERE post.postid = posttag.postid
AND posttag.tagid = tag.tagid
AND tag.tagid IN (1, 2)
) posts
但现在它失去了所有其他标签,好像所有帖子都只有两个标签,这是不正确的。还有一些空标签!
这里是SQLFiddle游乐场。
如何简单地检查 ID 1 和 2 是否存在于 ARRAY_AGG 中,这样它就不会改变结果?
【问题讨论】:
-
如果你想要一个逗号分隔的列表,
string_agg()可能比array_agg()更好
标签: sql postgresql database-design