我不认为这与子查询有关。但我有点不清楚如何搜索这个问题。
我想连接两个查询结果,一个是来自一个表,另一个是来自b表。我认为这是一个简单的查询,但我有点忘了它。
select id, value as a_value from a where id = 1 and sub_id = 1;
select id, value as b_value from b where id = 1 and sub_id = 2;
最终,我想获得a_value || b_value(两个值的聚合),我怎么能实现这个呢?
我的想法是
select aa.a_value || bb.b_value (
(select id, value from a where id = 1 and sub_id = 1) aa,
(select id, value from a where id = 1 and sub_id = 2) bb
)
看来绝对错了。你能帮到这个吗?
我的问题是我想为每个查询提供一些参考,在上面的查询中,aa和bb是我想要获得的参考。 实际上,我想要实现的真实查询有点复杂。
select aa.a_value || bb.b_value (
(select id, to_clob(value) as a_value from a where id = 1 and sub_id = 1) aa,
(select id, listagg(value, '') as b_value within group (order by sub_id) from a where id = 1 and sub_id >=2 group by id) bb);
我想这样做的原因是在聚合之后,我遇到'ORA-01489:字符串连接的结果太长'。其中一个解决方案可以是上面的查询。所以,我想做那个查询。
Oracle版本信息是 Oracle Database 12c企业版12.1.0.2.0版 - 64位生产
这是一个例子 表格有以下记录。
id sub_id value
1 1 a .... a (1000 char)
1 2 b .... b (1000 char)
1 3 c .... c (1000 char)
1 4 d .... d (1000 char)
1 5 e .... e (1000 char)
我想要创建的字符串是 a .... ab .... bc .... cd .... de .... e,属于id = 1的整个字符串的聚合。 为了做到这一点,我可以使用listagg但listadd函数的返回类型是varchar2。在聚合之后,返回的字符串变为5,000个字符,因此它返回错误'ORA-01489:字符串连接的结果太长',因为varchar2限制为4,000个字符。为了解决这个问题,我不得不使用TO_CLOB函数将第一个字符串'a .... a'转换为clob类型然后我聚合其余的字符串('b .... b','c .. ...... c','d .... d','e .... e')进入那个clob,a .... a。为了做到这一点,我想为它创建查询。
答案 0 :(得分:1)
始终声明您的数据库版本 - 完整版本号,由select * from v$version
返回(例如,我的是12.1.0.2.0)。
为什么重要?例如,在这种情况下,您可以使用listagg()
函数 - 但仅限于您的版本是11.2或更高版本(不是11.1!)
select id, listagg(value) within group (order by sub_id) as value_list
from a
where id = 1 and sub_id in (1, 2)
group by id -- not needed in this case; needed if you do it for more than one id
当然,简单的连接在几乎任何环境中都没有意义;您可能希望用空格或逗号分隔“值” - 您可以通过向listagg()
提供第二个参数(可选)来实现。