Det omedelbara felet orsakas av att två alias ges till resultatet av sammanlänkningen:Du har AS LIST as ids
. Du kan inte ge två alias till resultatet av en beräkning. Om du vill att den nyskapade tabellen ska ha en kolumn LIST
radera sedan as ids
, och vice versa.
Då kommer du att stöta på ett annat fel:du försöker ORDER BY t1.a
i aggregeringen. Det kommer inte att fungera; du kan inte beställa efter en CLOB i XML-aggregationen. Bryr du dig verkligen om i vilken ordning aggregeringen sker? Om du inte gör det, ändra till ORDER BY NULL
. Om du bryr dig har du ett problem, eftersom en order_by_clause
i Oracle kan helt enkelt inte beställa efter ett CLOB-uttryck. Du måste skapa en separat kolumn för beställning med andra metoder.
I den övergripande lösningen finns det inget behov av WITH-satsen. Varhelst du hänvisar till "input_strings" i frågan (förutom WITH-satsen), skriv bara "table_expressions".
REDIGERA
Så här kan detta fås att fungera. Först kommer jag att visa CREATE TABLE-satserna. Jag antar att table_expressions
har en CLOB-kolumn med söksträngar, och att det INGA DUBLICATES finns i denna kolumn. Trots det behöver tabellen också en separat primärnyckel, av en datatyp som inte är LOB eller annan lång, icke-standardtyp. Jag använder NUMBER för detta.
Sedan aggregerar jag efter denna primärnyckelkolumn. Tyvärr, jag kan inte välja söksträngen samtidigt. Jag kunde SELECT MAX(t2.a)
men det fungerar inte med CLOB-värden heller! Istället behöver jag ytterligare en koppling för att matcha primärnyckeln med söksträngen. (Tyvärr, frågan kommer att ta så mycket längre tid på grund av detta...)
I aggregeringen sorterar jag efter de första 4000 tecknen i strängvärdet från kolumn a
. Detta är inte lika bra som att sortera efter hela inmatningssträngen, men det är ändå bättre än att sortera 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
;
Låt oss nu kolla vad vi har:
select * from a_y;
A IDS
------------------------- ---------------------------------------------------------
atveroeosipsum atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test stetclitakasdtest
stetclitakasd stetclitakasdtest
noseatakimata noseatakimataatveroeosipsum
loremipsumdolor atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr consetetursadipscingelitr
REDIGERA #2
Om du behöver sammanfoga ID:n från tabellen a_x
(kolumn b
), inte själva CLOB, ersätt sedan t1.a
med t1.b
(och i ORDER BY
sats i XMLAGG
, du behöver ingen cast
, bara 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