如何使用 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个字符?
oracle的 listagg() WITHIN GROUP ()函数使用
oracle的 listagg() WITHIN GROUP ()函数使用