问题描述
嗨,伙计们,
如果我对单个表使用LISTAGG,它会在该列中给出距离值。但是,如果我通过连接多个表使用它,即使它们重复,它也会给出所有值。
场景:
创建表TEMP1(ID1号,TYPE1 CHAR(5));
插入TEMP1 (ID1,TYPE1) 值 (1,'t11');
插入TEMP1 (ID1,TYPE1) 值 (1,'t12');
创建表TEMP2(ID1号,TYPE2 CHAR(5));
插入TEMP2 (ID1,TYPE2) 值 (1,'t21');
插入TEMP2 (ID1,TYPE2) 值 (1,'t22');
下面的查询给出了col2中的不同值,我很擅长:
从TEMP1中选择组 (按类型1排序) 中的TEMP1.ID1,LISTAGG (类型1,',')
按TEMP1.ID1分组;
下面的查询给出了我不想要的col2中的所有值,这里我只想要来自LISTAGG函数的不同值。
从TEMP1,TEMP2中选择不同的TEMP1.ID1,LISTAGG (类型1,',') 组 (按类型1排序)
其中TEMP1.ID1 = TEMP2.ID1
按TEMP1.ID1分组;
谢谢!
如果我对单个表使用LISTAGG,它会在该列中给出距离值。但是,如果我通过连接多个表使用它,即使它们重复,它也会给出所有值。
场景:
创建表TEMP1(ID1号,TYPE1 CHAR(5));
插入TEMP1 (ID1,TYPE1) 值 (1,'t11');
插入TEMP1 (ID1,TYPE1) 值 (1,'t12');
创建表TEMP2(ID1号,TYPE2 CHAR(5));
插入TEMP2 (ID1,TYPE2) 值 (1,'t21');
插入TEMP2 (ID1,TYPE2) 值 (1,'t22');
下面的查询给出了col2中的不同值,我很擅长:
从TEMP1中选择组 (按类型1排序) 中的TEMP1.ID1,LISTAGG (类型1,',')
按TEMP1.ID1分组;
下面的查询给出了我不想要的col2中的所有值,这里我只想要来自LISTAGG函数的不同值。
从TEMP1,TEMP2中选择不同的TEMP1.ID1,LISTAGG (类型1,',') 组 (按类型1排序)
其中TEMP1.ID1 = TEMP2.ID1
按TEMP1.ID1分组;
谢谢!
专家解答
在当前版本的Oracle中,LISTAGG不支持DISTINCT,因此在应用listagg之前,您需要自己照顾distinct值。
这是一个例子
这是一个例子
SQL> drop table t purge; Table dropped. SQL> SQL> create table t ( 2 x int, 3 v varchar2(10) 4 ); Table created. -- -- x=1 will be good stuff, x=2 will be bad stuff -- SQL> SQL> insert into t values (1,'John'); 1 row created. SQL> insert into t values (1,'Sue'); 1 row created. SQL> insert into t values (1,'Mark'); 1 row created. SQL> SQL> SQL> insert into t values (2,'John'); 1 row created. SQL> insert into t values (2,'Sue'); 1 row created. SQL> insert into t values (2,'John'); 1 row created. SQL> insert into t values (2,'Sue'); 1 row created. SQL> insert into t values (2,'Jane'); 1 row created. SQL> SQL> select listagg(v,',') within group ( order by v ) 2 from t 3 where x = 1; LISTAGG(V,',')WITHINGROUP(ORDERBYV) ---------------------------------------------------------------------------------------------------------------------------------- John,Mark,Sue 1 row selected. SQL> SQL> SQL> select listagg(v,',') within group ( order by v ) 2 from t 3 where x = 2; LISTAGG(V,',')WITHINGROUP(ORDERBYV) ---------------------------------------------------------------------------------------------------------------------------------- Jane,John,John,Sue,Sue 1 row selected. SQL> SQL> select listagg(v,',') within group ( order by v ) 2 from ( select distinct v from t where x = 2 ); LISTAGG(V,',')WITHINGROUP(ORDERBYV) ---------------------------------------------------------------------------------------------------------------------------------- Jane,John,Sue 1 row selected. SQL>
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




