【问题标题】:distinct listagg in sql viewsql视图中的不同listagg
【发布时间】:2015-04-21 08:33:31
【问题描述】:

我有一张这样的桌子:

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、名称),但我无法将其添加到视图中(最常见的错误是无效标识符)。

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

谢谢

【问题讨论】:

    标签: sql oracle view listagg


    【解决方案1】:

    在应用 LISTAGG 之前,使用子查询首先仅选择 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>
    

    另一种方法是从聚合值中删除重复项,正如此处https://stackoverflow.com/a/27817597/3989608 所回答的那样。

    例如,

    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>
    

    【讨论】:

    • 感谢您的帮助,但我试图避免添加另一个表。
    • 无论如何,事实证明,将所有名称连续获取视图所需的时间太长,所以我将尝试不同的方法
    • @dannylibren 为什么要添加另一个表?我创建了演示表,因为您没有提供任何测试用例。另外,我提供了两种解决方案。第一个直接访问表,第二个是子查询。事实上,第一个解决方案完全回答了你的问题。请将其标记为已回答。
    • 您想要的只是将聚合值添加到视图中。因此,您需要做的就是根据我给您的查询创建或替换视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2021-03-09
    • 2022-10-05
    • 2021-11-27
    相关资源
    最近更新 更多