Sql 2 Listagg相同的查询和重复值

Sql 2 Listagg相同的查询和重复值,sql,oracle,oracle11g,listagg,Sql,Oracle,Oracle11g,Listagg,如果1个科目有2本书,则该科目重复2次。我知道这个问题重复了一遍,但写得不对。 请帮帮我。谢谢18c和更早的Oracle 一种方法是使用row_number做您想要做的事情。您的查询相当复杂,但这里有一个想法: SELECT DISTINCT ROW_NUMBER () OVER (ORDER BY A.f_NAME ASC) AS r, A.ID, A.F_NAME, A.L_NAME, A.FATH

如果1个科目有2本书,则该科目重复2次。我知道这个问题重复了一遍,但写得不对。 请帮帮我。谢谢18c和更早的Oracle

一种方法是使用row_number做您想要做的事情。您的查询相当复杂,但这里有一个想法:

  SELECT DISTINCT
         ROW_NUMBER () OVER (ORDER BY A.f_NAME ASC) AS r,
         A.ID,
         A.F_NAME,
         A.L_NAME,
         A.FATHER_NAME,
         A.DOB,
         A.DEAD_DATE,
         A.GENDER,
         A.NATIONALITY,
         A.AUTHOR_INFO,
         A.REWARD,
         LISTAGG (TO_CHAR (S.SUBJECT_NAME), ', ')
            WITHIN GROUP (ORDER BY TO_CHAR (S.SUBJECT_NAME))
            AS SUBJECT_NAME,
         LISTAGG (TO_CHAR (B.TITLE), ', ')
            WITHIN GROUP (ORDER BY TO_CHAR (b.title))
            AS book
    FROM book_author ba
         RIGHT JOIN author a
            ON A.ID = BA.AUTHOR_ID
         LEFT JOIN book b
            ON B.ID = BA.BOOK_ID
         LEFT JOIN author_subject ass
            ON a.ID = ass.author_id
         LEFT JOIN subjects s
            ON s.id = ass.subject_id
   WHERE A.ACTIVE = 1
GROUP BY A.ID,
         A.F_NAME,
         A.L_NAME,
         A.FATHER_NAME,
         A.DOB,
         A.DEAD_DATE,
         A.GENDER,
         A.NATIONALITY,
         A.AUTHOR_INFO,
         A.REWARD;

我不知道您为什么要将subject_名称转换为字符串。我不明白为什么需要这样做,所以我删除了这个逻辑。

也许您可以简化问题中的查询,以便更简单地回答。你的问题比回答这个问题所需要的要复杂得多。
with x as (
      <whatever>
     )
select <grouping columns>, -- grouping columns
       list_agg(case when seqnum_subject_name = 1 then subject_name end, ', ') within group (order by subject_name),
       list_agg(case when seqnum_title = 1 then title end, ', ') within group (order by title)
from (select x.*,
             row_number() over (partition by <grouping columns>, subject_name order by subject_name) as seqnum_subject_name,
             row_number() over (partition by <grouping columns>, title order by title) as seqnum_title
      from x
     ) x
group by <grouping columns>;