【问题标题】:Remove duplicate values from a listagg in oracle从 oracle 中的 listagg 中删除重复值
【发布时间】:2016-10-24 10:18:52
【问题描述】:

我已经使用listagg 来连接和列出书籍以及补充书籍名称。

SELECT DISTINCT SUBSTR(LISTAGG(',-'||B1.BOOK_NO||','||B1.BOOK_NAME||','||A.AUTHOR_NAME||',-'||B2.BOOK_NO||','||B2.BOOK_NAME)   WITHIN GROUP (ORDER BY B2.BOOK_NO),2) 
FROM BOOK_LIST B1
INNER JOIN AUTHORS A ON A.AUTHOR_NO=B1.AUTHOR_NO
INNER JOIN SUPPLEMENTARY B2 ON B2.BOOK_NO = B1.BOOK_SUP_NO
WHERE B1.SEQ = 123;

但由于补充书的数量较多,所以我重复获得主要书名。

有没有办法删除重复的主书名和编号。

我的输出是这样的

-99,Anders Carlson ,-109,John Stuart,-99,Anders Carlson ,-47,James Anderson

这里重复了 99,我只想要一个 99。

期望的输出:

-99,Anders Carlson ,-109,John Stuart,-47,James Anderson

数据库数据:

书单:

NO | MAIN_BOOK_NO | MAIN_BOOK_NAME | BOOK_SUP_NO | AUTHOR_NO
1  |    12        |    xyz         |   5         |   2
2  |    22        |    abc         |   7         |   4

作者:

NO | AUTHOR_NO | AUTHOR_NAME
 1 |  2        | Alex
 2 |  3        | Leonard
 3 |  4        | Benjamin

补充:

NO | BOOK_NO | BOOK_NAME 
1  |   5     |   ABC
2  |   5     |   XYZ
3  |   7     |   LMN
4  |   7     |   DEF
5  |   7     |   NEW

输出应该是这样的

         NAME
12,xyz,Alex,-5,ABC,-5,XYZ
22,abc,Benjamin,-7,LMN,-7,DEF,-7,NEW

同样适用于表中的全部数据

【问题讨论】:

  • 请发布一些示例数据和期望的结果。
  • @Aleksej 我已经添加了我的输出和想要的结果,请检查
  • 如果你有一本书有很多补充,如何选择要显示的?有订单吗,要随机的吗?
  • 没有顺序,我想把这本书和它的补充书籍列在一个列名下
  • 我不清楚。请发布一些示例数据(表中的 daa 提取)以及您需要为该数据获取的内容。另外,为什么在查询中需要 AUTHORS 表?

标签: oracle replace listagg


【解决方案1】:

如果我理解正确,您需要将补充书籍列表附加到主书中,所以您实际上是在以下内容之后:

SELECT B1.MAIN_BOOK_NO||','||B1.MAIN_BOOK_NAME||',-'||
         LISTAGG(B2.BOOK_NO||','||B2.BOOK_NAME, ',-') WITHIN GROUP (ORDER BY B2.BOOK_NO) 
FROM   BOOK_LIST B1
       INNER JOIN AUTHORS A ON A.AUTHOR_NO=B1.AUTHOR_NO
       INNER JOIN SUPPLEMENTARY B2 ON B2.BOOK_NO = B1.BOOK_SUP_NO
WHERE  B1.SEQ = 123
GROUP BY B1.MAIN_BOOK_NO, B1.MAIN_BOOK_NAME;

【讨论】:

  • 我收到not a single-group group function 错误
  • b1.seq 是 book_list 表的主键吗?
  • 是的,它是主键
  • 好的,我已经更新了答案以添加缺少的 group by 子句。如果您对 book_list 表中的多行运行此操作,那么您可能还需要将 B1.SEQ 添加到 group by 子句中。
  • @pahariayogi 这不是你冒犯了我,而是 cmets 用于澄清事情或提供建设性的批评。您之前的评论虽然是真实的(至少在您写它的时候),但并没有增加任何有价值的东西。如果您已经添加了“您需要在此答案中的查询中添加 group by 子句”的内容,那将更有帮助。希望这能澄清事情吗?
【解决方案2】:

看看有没有用

select T1.MAIN_BOOK_NO, T11.MAIN_BOOK_NAME, LISTAGG(',-'||',-'||T1.BOOK_NO||','||T1.BOOK_NAME) WITHIN GROUP (order by T1.BOOK_NO)
from
(
SELECT B1.MAIN_BOOK_NO, B1.MAIN_BOOK_NAME, B2.BOOK_NO, B2.BOOK_NAME
FROM BOOK_LIST B1
INNER JOIN AUTHORS A ON A.AUTHOR_NO=B1.AUTHOR_NO
INNER JOIN SUPPLEMENTARY B2 ON B2.BOOK_NO = B1.BOOK_SUP_NO
WHERE B1.SEQ = 123
group by B1.MAIN_BOOK_NO, B1.MAIN_BOOK_NAME, B2.BOOK_NO, B2.BOOK_NAME
order by B2.BOOK_NO
) T1 
group by T1.MAIN_BOOK_NO, T1.MAIN_BOOK_NAME;

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多