如何使用 listagg 运算符,以便查询应该获取逗号分隔的值

Posted

技术标签:

【中文标题】如何使用 listagg 运算符,以便查询应该获取逗号分隔的值【英文标题】:how to use listagg operator so that the query should fetch comma separated values 【发布时间】:2020-01-29 11:21:46 【问题描述】:
SELECT (SELECT STRING_VALUE 
        FROM EMP_NODE_PROPERTIES 
        WHERE NODE_ID=AN.ID ) containedWithin
FROM EMP_NODE AN 
WHERE AN.STORE_ID = ALS.ID 
AND an.TYPE_QNAME_ID=(SELECT ID 
                      FROM EMP_QNAME 
                      where LOCAL_NAME = 'document') 
AND
AND AN.UUID='13456677';

从上面的查询我得到以下错误。 ORA-01427: 单行子查询返回多于一行

那么如何改变上面的查询,让它获取逗号分隔的值

【问题讨论】:

als 代表什么?你在这里的别名:AN.STORE_ID=ALS.ID AND 【参考方案1】:

这个查询不会返回你提到的错误,因为

有两个 AND 和 没有 ALS 表(或其别名)。

我建议您发布正确编写的内容,然后我们可以讨论其他错误。


基本上,返回多个值的是select string_value ...select id ...(甚至两者)。

最明显的“解决方案”是使用select DISTINCT 另一个是包含where rownum = 1 或者,使用聚合函数,例如select max(string_value) ...

虽然最合适的选择是连接所有涉及的表并确定哪一行(值)是正确的,并调整查询(即其WHERE 子句)以确保返回所需的值。

【讨论】:

【参考方案2】:

你似乎想要这样的东西:

SELECT LISTAGG(NP.STRING_VALUE, ',') WITHIN GROUP(ORDER BY NP.STRING_VALUE) 
       as containedWithin
  FROM EMP_NODE N
  JOIN EMP_QNAME Q
    ON N.TYPE_QNAME_ID = Q.ID
  LEFT JOIN EMP_NODE_PROPERTIES NP
    ON NP.NODE_ID = N.ID
 WHERE Q.LOCAL_NAME = 'document'
   AND AN.UUID = '13456677';

这有点推测,因为由于 Littlefoot 解释的原因,您的原始查询不会运行。

【讨论】:

以上是关于如何使用 listagg 运算符,以便查询应该获取逗号分隔的值的主要内容,如果未能解决你的问题,请参考以下文章

如何调整LISTAGG以在选择查询中支持超过4000个字符?

使用 LISTAGG 和 CASE 语句的 SQL 查询

oracle的 listagg() WITHIN GROUP ()函数使用

oracle的 listagg() WITHIN GROUP ()函数使用

oracle的 listagg() WITHIN GROUP ()函数使用

Oracle的 listagg() WITHIN GROUP ()函数使用