sql server—按字母顺序对具有多对多关系的记录进行排序

rggaifut  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(368)

我有以下db表:comment和tag以及comment\u tag。它们之间存在着多对多的关系,实际上单个注解可以有多个标记,单个标记可以在多个注解中使用。让我们想象一下:

COMMENT
---------------
ID      TEXT
1       comment1
2       comment2
3       comment3
4       comment4

TAG
---------------
ID      NAME
1       bb
2       cc
3       ca
4       aa
5       ac
6       bd

COMMENT_TAG
---------------
ID_COMMENT      ID_TAG
1               1
1               2
1               3
1               4
2               1
2               3
3               3
3               4
3               5
3               6
4               1
4               2
4               3
4               4
4               5
4               6

因此,在fe侧显示以下数据

Comment     Tags
==================================
comment1    bb, cc, ca, aa
comment2    bb, ca
comment3    ca, aa, ac, bd
comment4    bb, cc ,ca, aa, ac, bd

我想按以下方式分类:
每个注解按字母顺序排列1个标签:

Comment     Tags
==================================
comment1    aa, bb, ca, cc
comment2    bb, ca
comment3    aa, ac, bd, ca
comment4    aa, ac, bb, bd, ca, cc

2按标签的字母顺序对注解排序:

Comment     Tags
==================================
comment4    aa, ac, bb, bd, ca, cc
comment3    aa, ac, bd, ca
comment1    aa, bb, ca, cc
comment2    bb, ca

您能告诉我们如何用sql实现它吗?或者告诉我们一些为这种用例排序的替代方法吗?

sgtfey8w

sgtfey8w1#

加入表并按注解分组。
然后使用如下函数 LISTAGG() 对于oracle 11g+,要串联每个注解的所有标记:

select c.text, listagg(t.name, ',') within group (order by t.name) tags
from "COMMENT" c
left join COMMENT_TAG ct on ct.id_comment = c.id
left join TAG t on t.id = ct.id_tag
group by c.id, c.text

添加 ORDER BY 每种情况的条款:

order by c.text

或:

order by tags

请看演示。

相关问题