sql视图中的不同listagg

sql视图中的不同listagg,sql,oracle,view,listagg,Sql,Oracle,View,Listagg,我有一张这样的桌子: id name 1 ben 1 ben 2 charlie 2 dan 2 edgar 3 frank 我希望以下列成为sql developer中现有视图的一部分: id names 1 ben 2 charlie,dan,edgar 3 frank 我能够使用listagg生成表(id、名称),但我无法将其添加到视图中(最常见的错误是无效标识符) 如果需要更多信息,请告诉我 谢谢在应用listag之前,使用子查询首先只选择不同

我有一张这样的桌子:

id  name
1   ben
1   ben
2   charlie
2   dan
2   edgar
3   frank
我希望以下列成为sql developer中现有视图的一部分:

id  names
1   ben
2   charlie,dan,edgar
3   frank
我能够使用listagg生成表(id、名称),但我无法将其添加到视图中(最常见的错误是无效标识符)

如果需要更多信息,请告诉我


谢谢

在应用listag之前,使用子查询首先只选择不同的

比如说,

SQL> SELECT id,
  2    RTRIM(REGEXP_REPLACE(listagg (name, ',') WITHIN GROUP (
  3  ORDER BY id), '([^,]+)(,\1)+', '\1'), ',') name
  4  FROM t
  5  GROUP BY id;

        ID NAME
---------- ---------------------------------------------
         1 ben
         2 charlie,dan,edgar
         3 frank

SQL>
设置

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), '([^,]+)(,\1)+', '\1'), ',') name
  4  FROM t
  5  GROUP BY id;

        ID NAME
---------- ---------------------------------------------
         1 ben
         2 charlie,dan,edgar
         3 frank

SQL>

谢谢您的帮助,但我一直在尝试避免添加其他表。无论如何,结果显示,获取一行中的所有名称对视图来说花费的时间太长,因此我将尝试其他方法approach@dannylibren为什么要添加另一个表?我创建这个表是为了演示,因为您没有提供任何测试用例。此外,我还提供了两种解决方案。第一个直接访问表,第二个是子查询。事实上,第一个解决方案完全回答了您的问题。请将其标记为已回答。您只需将聚合值添加到视图中。因此,您所需要做的就是根据我提供的查询创建或替换视图。