sql 视图中的不同 listagg
distinct listagg in sql view
我有一个 table 这样的:
id name
1 ben
1 ben
2 charlie
2 dan
2 edgar
3 frank
并且我希望以下列成为 sql 开发人员中现有视图的一部分:
id names
1 ben
2 charlie,dan,edgar
3 frank
我能够使用 listagg 生成 table(id、名称),但我无法将其添加到视图中(最常见的错误是无效标识符)。
如果需要更多信息,请告诉我。
谢谢
在应用 LISTAGG.
之前,使用子查询首先 select 仅 DISTINCT 行
例如,
设置
SQL> CREATE TABLE t
2 (id int, name varchar2(7));
Table created.
SQL>
SQL> INSERT ALL
2 INTO t (id, name)
3 VALUES (1, 'ben')
4 INTO t (id, name)
5 VALUES (1, 'ben')
6 INTO t (id, name)
7 VALUES (2, 'charlie')
8 INTO t (id, name)
9 VALUES (2, 'dan')
10 INTO t (id, name)
11 VALUES (2, 'edgar')
12 INTO t (id, name)
13 VALUES (3, 'frank')
14 SELECT * FROM dual;
6 rows created.
SQL>
查询
SQL> WITH DATA AS(
2 SELECT DISTINCT ID, NAME FROM t
3 )
4 SELECT ID,
5 listagg(NAME, ',') WITHIN GROUP (
6 ORDER BY ID) NAME
7 FROM DATA
8 GROUP BY ID;
ID NAME
---------- -----------------------------
1 ben
2 charlie,dan,edgar
3 frank
SQL>
另一种方法是从聚合值中删除重复项,如此处回答。
例如,
SQL> SELECT id,
2 RTRIM(REGEXP_REPLACE(listagg (name, ',') WITHIN GROUP (
3 ORDER BY id), '([^,]+)(,)+', ''), ',') name
4 FROM t
5 GROUP BY id;
ID NAME
---------- ---------------------------------------------
1 ben
2 charlie,dan,edgar
3 frank
SQL>
我有一个 table 这样的:
id name
1 ben
1 ben
2 charlie
2 dan
2 edgar
3 frank
并且我希望以下列成为 sql 开发人员中现有视图的一部分:
id names
1 ben
2 charlie,dan,edgar
3 frank
我能够使用 listagg 生成 table(id、名称),但我无法将其添加到视图中(最常见的错误是无效标识符)。
如果需要更多信息,请告诉我。
谢谢
在应用 LISTAGG.
之前,使用子查询首先 select 仅 DISTINCT 行例如,
设置
SQL> CREATE TABLE t
2 (id int, name varchar2(7));
Table created.
SQL>
SQL> INSERT ALL
2 INTO t (id, name)
3 VALUES (1, 'ben')
4 INTO t (id, name)
5 VALUES (1, 'ben')
6 INTO t (id, name)
7 VALUES (2, 'charlie')
8 INTO t (id, name)
9 VALUES (2, 'dan')
10 INTO t (id, name)
11 VALUES (2, 'edgar')
12 INTO t (id, name)
13 VALUES (3, 'frank')
14 SELECT * FROM dual;
6 rows created.
SQL>
查询
SQL> WITH DATA AS(
2 SELECT DISTINCT ID, NAME FROM t
3 )
4 SELECT ID,
5 listagg(NAME, ',') WITHIN GROUP (
6 ORDER BY ID) NAME
7 FROM DATA
8 GROUP BY ID;
ID NAME
---------- -----------------------------
1 ben
2 charlie,dan,edgar
3 frank
SQL>
另一种方法是从聚合值中删除重复项,如此处回答
例如,
SQL> SELECT id,
2 RTRIM(REGEXP_REPLACE(listagg (name, ',') WITHIN GROUP (
3 ORDER BY id), '([^,]+)(,)+', ''), ',') name
4 FROM t
5 GROUP BY id;
ID NAME
---------- ---------------------------------------------
1 ben
2 charlie,dan,edgar
3 frank
SQL>