简体   繁体   English

Oracle LISTAGG案例返回不同的值

[英]Oracle LISTAGG case return distinct values

I am writing a ORACLE select statement with LISTAGG. 我正在用LISTAGG编写ORACLE select语句。 It works but when I was validating the data, I saw duplicates like 1:1,1:1,2:2,2:2. 它可以工作,但是当我验证数据时,我看到了1:1,1:1,2:2,2:2之类的重复项。

I verified that the database do have duplicate. 我验证数据库确实有重复项。 The query is for two tables in a one to many relationship. 查询是一对一关系中的两个表。 Below is a snippet of my query but I changed the column names etc.. 以下是我的查询的摘要,但我更改了列名等。

how can I modified the following query to return unique values for each person? 如何修改以下查询以返回每个人的唯一值?

Thanks 谢谢

SELECT Table1.PERSON_ID, 
       Table1.FIRST_NAME,
       Table1.MIDDLE_NAME,
       Table1.LAST_NAME,

LISTAGG(case  
        when Table2.DESCRIPTION = '1' then '1:1'
        when Table2.DESCRIPTION = '2' then '2:2'
        when Table2.DESCRIPTION = '3' then '3:3'
        when Table2.DESCRIPTION = '4' then '4:4'
        when Table2.DESCRIPTION = '5' then '5:5'
        when Table2.DESCRIPTION = '6' then '6:6'
        when Table2.DESCRIPTION = '7' then '7:7'
        when Table2.DESCRIPTION = '8' then '8:8'
        when Table2.DESCRIPTION = '9' then '9:9'


      else ''

 end, ',')  
WITHIN GROUP (ORDER BY Table2.DESCRIPTION )  

FROM Table1
LEFT JOIN Table2

ON Table2.PERSON_ID = Table1.PERSON_ID
GROUP BY Table1.PERSON_ID,Table1.FIRST_NAME,Table1.MIDDLE_NAME, Table1.LAST_NAME

In Oracle, you need to do the DISTINCT in a subquery: 在Oracle中,您需要在子查询中执行DISTINCT

SELECT PERSON_ID, FIRST_NAME, MIDDLE_NAME, LAST_NAME,
        LISTAGG(val, ',') WITHIN GROUP (ORDER BY DESCRIPTION )
FROM (SELECT DISTINCT Table1.PERSON_ID, Table1.FIRST_NAME, Table1.MIDDLE_NAME, Table1.LAST_NAME, Table2.Description
             (case when Table2.DESCRIPTION = '1' then '1:1'
                   when Table2.DESCRIPTION = '2' then '2:2'
                   when Table2.DESCRIPTION = '3' then '3:3'
                   when Table2.DESCRIPTION = '4' then '4:4'
                   when Table2.DESCRIPTION = '5' then '5:5'
                   when Table2.DESCRIPTION = '6' then '6:6'
                   when Table2.DESCRIPTION = '7' then '7:7'
                   when Table2.DESCRIPTION = '8' then '8:8'
                   when Table2.DESCRIPTION = '9' then '9:9'
                   else ''
              end) as val
      FROM Table1 LEFT JOIN
           Table2
           ON Table2.PERSON_ID = Table1.PERSON_ID
     ) 
GROUP BY PERSON_ID, FIRST_NAME, MIDDLE_NAME, LAST_NAME;

Assuming Table2 has PERSON_ID as foreign key pointing to Table1 , what you need to do is to replace 假设Table2PERSON_ID作为指向Table1外键,则需要替换

FROM Table1
LEFT JOIN Table2
ON Table2.PERSON_ID = Table1.PERSON_ID

with

FROM Table1
LEFT JOIN 
(SELECT DISTINCT PERSON_ID, DESCRIPTION FROM Table2) T2
ON T2.PERSON_ID = Table1.PERSON_ID

and then change Table2 to T2 in LISTAGG() (including in the WITHIN GROUP (ORDER BY ...) clause!) 然后在LISTAGG()中将Table2更改为T2 (包括WITHIN GROUP (ORDER BY ...)子句!)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM