我一直在处理两个表(一对多)之间的查询,并使用LISTAGG将所有字段一起附加到一个字符串中。我注意到输出有重复值,我发现表中有重复记录。如何使用不同或其他技术删除副本。
这是我的查询
SELECT Table2.PersonId,
LISTAGG(case Table2.BookTitleDesc
when 'Value1' then '1'
when Value2' then '2'
when 'Value3' then '3'
when 'Value4' then '4'
end, ':')
WITHIN GROUP (ORDER BY Table2.BookTitleDesc )
FROM Table1
INNER JOIN Table2
ON Table1.PersonId = Table2.PersonId
GROUP BY Table2.PERSON_ID
我得到的输出就像1:1:2:3:4。理想情况下,BookTitleDesc应该是唯一的,但表格有重复。在我的CASE .. WHEN声明中,它会很长。一世 有很多要过滤,我看到有很多重复。如何使用DISTINCT或其他技术来避免输出中的重复?
由于
答案 0 :(得分:0)
你不能在聚合之前通过SELECT DISTINCT运行吗?
SELECT s.PersonId,
LISTAGG(case s.BookTitleDesc
when 'Value1' then '1'
when 'Value2' then '2'
when 'Value3' then '3'
when 'Value4' then '4'
end, ':')
WITHIN GROUP (ORDER BY s.BookTitleDesc )
FROM (
SELECT DISTINCT Table2.PersonId,
Table2.BookTitleDesc
FROM Table1
INNER JOIN Table2
ON Table1.PersonId = Table2.PersonId
) s
GROUP BY s.PERSON_ID
答案 1 :(得分:0)
LISTAGG聚合函数没有删除重复项的选项,因此您必须先删除它们。
在下面的代码中,Table2_ND将是Table2,没有重复,与使用“WITH”语法糖的Bacon Bits基本相同。
WITH Table2_ND AS (SELECT DISTINCT * FROM Table2)
SELECT Table2_ND.PersonId
,LISTAGG(
CASE Table2_ND.BookTitleDesc
WHEN 'Value1' THEN '1'
WHEN 'Value2' THEN '2'
WHEN 'Value3' THEN '3'
WHEN 'Value4' THEN '4'
END, ':') WITHIN GROUP (ORDER BY Table2_ND.BookTitleDesc)
FROM Table1 INNER JOIN Table2_ND ON Table1.PersonId = Table2_ND.PersonId
GROUP BY Table2_ND.PersonId, Table2.BookTitleDesc;
答案 2 :(得分:0)
在最新的 Oracle sql(我认为从 19c 版开始)有 listagg 不同:
select listagg(distinct ID, ', ') from TAB_1 t1 inner join TAB_2 t2 on t1.ID = t2.TAB1_ID;
这只会给你不同的 ID