【发布时间】:2023-04-03 22:50:02
【问题描述】:
我有两张表,table1有一个entry_ID,entry_date等入口信息。 table2 有 entry_ID 和 entry_subject。每个entry_ID可以有任意多个entry_subjects。
我想要一个返回entry_ID、entry_date 的查询,以及与该条目对应的主题列表,以逗号分隔。
第一步似乎只是获取一个返回entry_ID 和来自table2 的以逗号分隔的主题列表的查询。一旦我知道加入应该很容易。
我调整了recursive CTE method from this site: 以适应我的情况:
WITH RECURSIVE CTE (entry_ID, subjectlist, subject, length)
AS ( SELECT entry_ID, cast( '' as varchar(8000))
, cast( '' as varchar(8000)), 0
FROM table2
GROUP BY entry_ID
UNION ALL
SELECT t2.entry_ID,
cast(subjectlist || CASE length = 0 THEN '' ELSE ', ' END
|| entry_subject AS varchar(8000) ),
cast (t2.entry_subject as varchar(8000)),
length +1
FROM CTE c
INNER JOIN table2 t2
on c.entry_ID=t2.entry_ID where t2.entry_subject > c.subject)
SELECT entry_ID, subjectlist FROM (
SELECT entry_ID, subjectlist, RANK() OVER (
PARTITION BY entry_ID order by length DESC)
FROM CTE) D (entry_ID, subjectlist, rank) where rank = 1;
它有效,我得到了我期望的响应。为了实现我的最终目标,我使用的查询是这样的:
SELECT t1.* t2.subjectlist FROM table1
JOIN (ABOVE QUERY) AS t2 on t1.entry_ID=t2.entry_ID;
这看起来很笨拙。这真的是最好的方法吗?
【问题讨论】:
-
就个人而言,如果可能的话,我会在数据库之外的中间层执行此操作。
-
中间层是什么意思?我想我可以在进行数据库调用的 bash 脚本中更轻松地做到这一点,但我使用的是一个实用程序库,它接受输入字符串,它解释为查询并直接在适当的数据库中执行。
-
哦,我没有得到那种区别。是的,这就是我的意思。
标签: sql postgresql aggregate-functions