未在预期位置找到FROM关键字,文本选择Oracle SQL
我想生成一个表,其中包含子字符串和另一个表的ID,其中包含子字符串。见问题 表_表达式包含所需的子字符串 我的真实数据生成了大量要连接的ID。在使用真实数据运行代码后,返回错误01489。00000-字符串连接的结果太长 *原因:字符串连接结果超过最大大小。 *操作:确保结果小于最大大小。发生 如何重写代码以将生成的列ID格式化为CLOB格式? 我看了看问题,但我不明白贴出的答案中的代码 此代码:未在预期位置找到FROM关键字,文本选择Oracle SQL,oracle,concatenation,clob,Oracle,Concatenation,Clob,我想生成一个表,其中包含子字符串和另一个表的ID,其中包含子字符串。见问题 表_表达式包含所需的子字符串 我的真实数据生成了大量要连接的ID。在使用真实数据运行代码后,返回错误01489。00000-字符串连接的结果太长 *原因:字符串连接结果超过最大大小。 *操作:确保结果小于最大大小。发生 如何重写代码以将生成的列ID格式化为CLOB格式? 我看了看问题,但我不明白贴出的答案中的代码 此代码: create table a_y as with input_strings ( a ) as
create table a_y
as
with
input_strings ( a ) as (
select a
from table_expressions
)
select t2.a, RTRIM(XMLAGG(XMLELEMENT(E,t1.a,',').EXTRACT('//text()') ORDER BY t1.a).GetClobVal(),',') AS LIST as ids
from a_x t1
join input_strings t2 on t1.a like '%' || t2.a || '%'
group by t2.a
;
根据未在预期位置找到的关键字生成错误。
我想生成一个表a_y,它应该是这样的,列a和列ID应该是clob格式:
A | IDs
-----------------------------|-------
atveroeosipsum | 1,3
test | 2
stetclitakasd | 2
noseatakimata | 3
loremipsumdolor | 1,4
consetetursadipscingelitr | 5
如何修复此问题?立即出现的错误是由于将两个别名指定给连接的结果而导致的:您的AS LIST AS id。计算结果不能有两个别名。如果希望新创建的表具有列列表,请将其作为ID删除,反之亦然 然后您将遇到另一个错误:您正试图在聚合中按t1.a排序。那是行不通的;不能在XML聚合中按CLOB排序。你真的在乎聚合发生的顺序吗?如果没有,则按NULL更改为ORDER。如果您真的在意,您就有问题了,因为在Oracle中,order_by_子句根本不能按CLOB表达式排序。您必须创建一个单独的列,以便使用其他方法进行排序 在整个解决方案中,不需要WITH子句。只要在查询中引用WITH子句以外的输入字符串,只需编写表表达式即可 编辑 以下是如何使其发挥作用。首先,我将显示CREATETABLE语句。我将假设table_表达式有一列CLOB搜索字符串,并且该列中没有重复项。即使如此,表也需要一个单独的主键,其数据类型不是LOB或其他长的、非标准类型。我用这个号码 然后我按这个主键列进行聚合。唉,我不能同时选择搜索字符串。我可以选择MAXt2.a,但这对CLOB值也不起作用!相反,我需要进一步的连接来匹配主键和搜索字符串。抱歉,由于此原因,查询将花费更长的时间 在聚合中,我按照列a中字符串值的前4000个字符进行排序。这不如按整个输入字符串排序好,但仍比按NULL排序好
create table a_x ( a, b ) as
select to_clob('atveroeosipsumloremipsumdolor'), 1 from dual union all
select to_clob('stetclitakasdtest') , 2 from dual union all
select to_clob('noseatakimataatveroeosipsum') , 3 from dual union all
select to_clob('loremipsumdolor') , 4 from dual union all
select to_clob('consetetursadipscingelitr') , 5 from dual
;
create table table_expressions ( a, pk ) as
select to_clob('atveroeosipsum') , 10 from dual union all
select to_clob('test') , 11 from dual union all
select to_clob('stetclitakasd') , 12 from dual union all
select to_clob('noseatakimata') , 13 from dual union all
select to_clob('loremipsumdolor') , 14 from dual union all
select to_clob('consetetursadipscingelitr'), 15 from dual
;
create table a_y as
select te.a, s.ids
from table_expressions te
join
(select t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.a,',').EXTRACT('//text()')
ORDER BY cast(t1.a as varchar2(4000))).GetClobVal(),',') as ids
from a_x t1
join table_expressions t2
on t1.a like '%' || t2.a || '%'
group by t2.pk
) s
on te.pk = s.pk
;
现在让我们检查一下我们得到了什么:
select * from a_y;
A IDS
------------------------- ---------------------------------------------------------
atveroeosipsum atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test stetclitakasdtest
stetclitakasd stetclitakasdtest
noseatakimata noseatakimataatveroeosipsum
loremipsumdolor atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr consetetursadipscingelitr
编辑2
如果需要连接表a_x列b中的id,而不是CLOB本身,则用t1.b替换t1.a,并且在XMLAGG的ORDER BY子句中,不需要任何强制转换,只需按t1.b排序即可
我修改了代码:创建表a_y as,输入字符串a as select a from table_expressions select t2.a,rtrimxmlaggxmlemente,t1.a,','。按NULL.GetClobVal提取'//text'顺序,'as id from a_x t1 join table_expressions t2 on t1.a,类似于“%”t2.a | |“%”按t2.a;分组;。数据类型不一致时出错:应为%s获得%s。我不明白。您可以省略输入字符串作为从表中选择表达式,因为它不再需要了。但这一不必要的WITH子句并不是错误的原因。错误消息应该准确地告诉您它发生在哪里-是吗?什么路线和位置。也许以一种不明显的方式,类似于Error13:48的东西意味着第13行,这行代码的第48个字符。现在我将其更改为:创建表a_y作为select t2.a,RTRIMXMLAGGXMLELEMENTE,t1.a,','.EXTRACT'//text'ORDER BY NULL.GetClobVal,','as id from a_x t1 join table_expressions t2 on t1.a,类似于“%”t2.a | |“%”按t2.a;分组;。错误所指的是t2.a的线组。无法分组吗?是的,我有一个主键,我更改了表以创建表table_表达式a clob,PK varchar24000;将全部插入表_表达式a,pk值“atveroeosipsum”,1插入表_表达式a,pk值“test”,2插入表_表达式a,pk值“stetclitakasd”,3插入表_表达式a,pk值“nosatakimata”,4插入表_表达式a,pk值“loremipsumdolor”,5插入表_表达式a,pk值'ConseteTursAdipscingiletr',6从双重选择中选择*;错误仍然存在。我想我有一个解决方法,我会在上面的答案中发布。表_表达式中的字符串片段必须是CLOB吗?它们应该是长度不超过4000个字符的相对较短的字符串,这似乎是有道理的 比那还要长。实际数据的列以CLOB表示。
select * from a_y;
A IDS
------------------------- ---------------------------------------------------------
atveroeosipsum atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test stetclitakasdtest
stetclitakasd stetclitakasdtest
noseatakimata noseatakimataatveroeosipsum
loremipsumdolor atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr consetetursadipscingelitr
drop table a_y purge;
create table a_y as
select te.a, s.ids
from table_expressions te
join
(select t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.b,',').EXTRACT('//text()')
ORDER BY t1.b).GetClobVal(),',') as ids
from a_x t1
join table_expressions t2
on t1.a like '%' || t2.a || '%'
group by t2.pk
) s
on te.pk = s.pk
;
select * from a_y;
A IDS
------------------------- ---
atveroeosipsum 1,3
test 2
stetclitakasd 2
noseatakimata 3
loremipsumdolor 1,4
consetetursadipscingelitr 5