De directe fout wordt veroorzaakt doordat er twee aliassen zijn gegeven aan het resultaat van de aaneenschakeling:U hebt AS LIST as ids
. U kunt geen twee aliassen geven aan het resultaat van een berekening. Als u wilt dat de nieuw gemaakte tabel een kolom heeft LIST
verwijder vervolgens as ids
, en vice versa.
Dan kom je een andere fout tegen:je probeert te ORDER BY t1.a
in de aggregatie. Dat zal niet werken; u kunt niet bestellen door een CLOB in de XML-aggregatie. Maakt het je echt uit in welke volgorde de aggregatie gebeurt? Als je dat niet doet, verander dan naar ORDER BY NULL
. Als het je kan schelen, heb je een probleem, aangezien in Oracle een order_by_clause
kan eenvoudigweg niet op een CLOB-expressie bestellen. U moet een aparte kolom maken om te bestellen door andere methoden te gebruiken.
In de algemene oplossing is de WITH-clausule niet nodig. Waar je ook verwijst naar "input_strings" in de query (behalve de WITH-clausule), schrijf gewoon "table_expressions".
BEWERKEN
Hier is hoe dit zou kunnen worden gemaakt om te werken. Eerst zal ik de CREATE TABLE-statements laten zien. Ik ga ervan uit dat table_expressions
een CLOB-kolom met zoekreeksen heeft en dat er GEEN DUPLICATES in deze kolom staan. Toch heeft de tabel ook een aparte primaire sleutel nodig, van een gegevenstype dat niet LOB is of een ander lang, niet-standaardtype. Ik gebruik hiervoor NUMBER.
Dan verzamel ik door deze primaire sleutelkolom. Helaas kan ik de zoekreeks niet tegelijkertijd selecteren. Ik zou kunnen SELECT MAX(t2.a)
maar dat werkt ook niet met CLOB-waarden! In plaats daarvan heb ik nog een join nodig om de primaire sleutel met de zoekreeks te matchen. (Sorry, de zoekopdracht duurt hierdoor veel langer...)
In de aggregatie sorteer ik op de eerste 4000 tekens van de tekenreekswaarde uit kolom a
. Dit is niet zo goed als sorteren op de hele invoerreeks, maar het is nog steeds beter dan bestellen op 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
;
Laten we nu eens kijken wat we hebben:
select * from a_y;
A IDS
------------------------- ---------------------------------------------------------
atveroeosipsum atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test stetclitakasdtest
stetclitakasd stetclitakasdtest
noseatakimata noseatakimataatveroeosipsum
loremipsumdolor atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr consetetursadipscingelitr
BEWERK #2
Als u de id's uit tabel a_x
. moet samenvoegen (kolom b
), niet de CLOB's zelf, vervang dan t1.a
met t1.b
(en, in de ORDER BY
clausule van XMLAGG
, je hebt geen cast
nodig , gewoon order by t1.b
).
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