Den umiddelbare fejl er forårsaget af, at der er givet to aliaser til resultatet af sammenkædningen:Du har AS LIST as ids
. Du kan ikke give to aliaser til resultatet af en beregning. Hvis du ønsker, at den nyoprettede tabel skal have en kolonne LIST
slet derefter as ids
, og omvendt.
Så vil du løbe ind i endnu en fejl:du forsøger at ORDER BY t1.a
i sammenlægningen. Det vil ikke virke; du kan ikke bestille efter en CLOB i XML-sammenlægningen. Er du virkelig ligeglad i hvilken rækkefølge aggregeringen sker? Hvis du ikke gør det, skal du ændre til ORDER BY NULL
. Hvis du er ligeglad, har du et problem, da der i Oracle er en order_by_clause
kan simpelthen ikke bestille efter et CLOB-udtryk. Du bliver nødt til at oprette en separat kolonne til bestilling ved at bruge andre metoder.
I den overordnede løsning er der ikke behov for WITH-klausulen. Uanset hvor du henviser til "input_strings" i forespørgslen (bortset fra WITH-sætningen), skal du blot skrive "table_expressions".
REDIGER
Her er, hvordan dette kunne fås til at fungere. Først vil jeg vise CREATE TABLE-udsagn. Jeg vil antage, at table_expressions
har en CLOB-kolonne med søgestrenge, og at der INGEN DUBLIKATER er i denne kolonne. Alligevel har tabellen også brug for en separat primær nøgle af en datatype, der ikke er LOB eller anden lang, ikke-standard-type. Jeg bruger NUMBER til dette.
Så aggregerer jeg efter denne primære nøglekolonne. Desværre, jeg kan ikke vælge søgestrengen på samme tid. Jeg kunne SELECT MAX(t2.a)
men det virker heller ikke med CLOB-værdier! I stedet har jeg brug for en yderligere joinforbindelse for at matche den primære nøgle til søgestrengen. (Beklager, forespørgslen vil tage så meget længere tid på grund af dette...)
I aggregeringen sorterer jeg efter de første 4000 tegn i strengværdien fra kolonne a
. Dette er ikke så godt som at sortere efter hele inputstrengen, men det er stadig bedre end at bestille efter 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
;
Lad os nu tjekke, hvad vi har:
select * from a_y;
A IDS
------------------------- ---------------------------------------------------------
atveroeosipsum atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test stetclitakasdtest
stetclitakasd stetclitakasdtest
noseatakimata noseatakimataatveroeosipsum
loremipsumdolor atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr consetetursadipscingelitr
REDIGERING #2
Hvis du har brug for at sammenkæde id'erne fra tabel a_x
(kolonne b
), ikke selve CLOB'erne, så erstat t1.a
med t1.b
(og i ORDER BY
klausul af XMLAGG
, du behøver ikke nogen cast
, bare 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