Listagg独特的价值 [英] Listagg distinct values

查看:82
本文介绍了Listagg独特的价值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我需要选择仅包含不同值的listagg列.不幸的是,我使用的是oracle 18.c,它不支持直接不同的选项,因此我可能必须使用嵌套选择(不确定?)来进行查询.我有以下SQL查询,我需要使用以下命令列出"adrml.email"列:不同的值.

hello I need to select a listagg column that only contains distinct values. Unfortunately I am using oracle 18.c and it doesnt support straight distinct option so I probably have to make it with a nested select (not sure?) I have the following SQL query, I need to listagg the "adrml.email" column with distinct values.

select distinct
c.trader_transact
, t.trader_descr
, d.third
, d.f_name
, d.def_phone
, d.def_mail
, d.f_city
, d.country_descr
, d.f_street
, con.first_name
, con.last_name
, adrph.formated_phone_nr
, link.adr
, link.contact
,adrdet.dt
,adrdet.street Contact_Street
,adrdet.post_code
,adrdet.city
,adrdet.country
,adrml.email
 ,LISTAGG(
        adrml.email,
        ' / '
    ) WITHIN GROUP(

    ORDER BY
        d.third
    )

from thr_v_third d
join tra_contract c on d.third = c.customer or d.third = c.supplier
join tra_trader t on t.trader = c.trader_transact
join thr_v_adr_lnk_contact link on link.third = d.third --and link.type = 1 and link.default_contact = 1
join adr_contact con on con.adr = link.adr and con.contact = link.contact
join adr_address_det adrdet on adrdet.adr = link.adr and adrdet.last = 1
left join adr_mail adrml on link.adr = adrml.adr and con.contact = adrml.contact and adrml.deflt = 1
left join adr_v_phones adrph on adrph.adr = link.adr and adrph.contact = link.contact and adrph.deflt = 1 and adrph.type = 1
where t.trader = 32
group by
c.trader_transact
, t.trader_descr 
 ,d.third
, d.f_name
, d.def_phone
, d.def_mail
, d.f_city
, d.country_descr
, d.f_street
, link.adr
, link.contact
, con.first_name
, con.last_name
,adrdet.dt
,adrdet.street
,adrdet.post_code
,adrdet.city
,adrdet.country
,adrml.email
, adrph.formated_phone_nr 
order by d.third

到目前为止,我在listagg列中收到重复的电子邮件.我该如何清除呢?

so far I am getting duplicate emails in the listagg column. How can I clear this out?

推荐答案

这是您拥有的:

SQL> select d.dname,
  2         listagg(e.job, ', ') within group (order by e.job) jobs
  3  from dept d join emp e on e.deptno = d.deptno
  4  group by d.dname;

DNAME          JOBS
-------------- ------------------------------------------------------------
ACCOUNTING     CLERK, MANAGER, PRESIDENT
RESEARCH       ANALYST, ANALYST, CLERK, CLERK, MANAGER
SALES          CLERK, MANAGER, SALESMAN, SALESMAN, SALESMAN, SALESMAN

这就是您想要的:

SQL> select x.dname,
  2         listagg(x.job, ', ') within group (order by x.job) jobs
  3  from (select distinct d.dname,
  4                        e.job
  5        from dept d join emp e on e.deptno = d.deptno
  6       ) x
  7  group by x.dname;

DNAME          JOBS
-------------- ------------------------------------------------------------
ACCOUNTING     CLERK, MANAGER, PRESIDENT
RESEARCH       ANALYST, CLERK, MANAGER
SALES          CLERK, MANAGER, SALESMAN

SQL>

所以,是的-首先找到不同的值,然后 listagg .

So, yes - first find distinct values, then listagg them.

这篇关于Listagg独特的价值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆