Kesalahan langsung disebabkan oleh dua alias yang diberikan pada hasil penggabungan:Anda memiliki AS LIST as ids
. Anda tidak dapat memberikan dua alias untuk hasil perhitungan. Jika Anda ingin tabel yang baru dibuat memiliki kolom LIST
lalu hapus as ids
, dan sebaliknya.
Kemudian Anda akan mengalami kesalahan lain:Anda mencoba untuk ORDER BY t1.a
dalam agregasi. Itu tidak akan berhasil; Anda tidak dapat memesan berdasarkan CLOB dalam agregasi XML. Apakah Anda benar-benar peduli dalam urutan apa agregasi terjadi? Jika tidak, ubah ke ORDER BY NULL
. Jika Anda peduli, Anda memiliki masalah, karena di Oracle sebuah order_by_clause
tidak bisa memesan dengan ekspresi CLOB. Anda harus membuat kolom terpisah untuk memesan dengan menggunakan metode lain.
Dalam solusi secara keseluruhan, klausa WITH tidak diperlukan. Di mana pun Anda merujuk ke "input_strings" dalam kueri (selain klausa WITH), cukup tulis "table_expressions".
EDIT
Berikut adalah bagaimana ini dapat dibuat untuk bekerja. Pertama saya akan menunjukkan pernyataan CREATE TABLE. Saya akan berasumsi bahwa table_expressions
memiliki kolom CLOB dari string pencarian, dan TIDAK ADA DUPLIKASI di kolom ini. Meski begitu, tabel tersebut juga membutuhkan primary key yang terpisah, dari tipe data yang bukan LOB atau tipe panjang lainnya, bukan tipe standar. Saya menggunakan NUMBER untuk ini.
Kemudian saya mengagregasi berdasarkan kolom kunci utama ini. Sayangnya, saya tidak dapat memilih string pencarian secara bersamaan. Saya bisa SELECT MAX(t2.a)
tapi itu juga tidak bekerja dengan nilai CLOB! Sebagai gantinya, saya perlu bergabung lebih lanjut untuk mencocokkan kunci utama dengan string pencarian. (Maaf, kueri akan memakan waktu lebih lama karena ini...)
Dalam agregasi, saya mengurutkan berdasarkan 4000 karakter pertama dari nilai string dari kolom a
. Ini tidak sebaik mengurutkan berdasarkan seluruh string input, tetapi masih lebih baik daripada mengurutkan dengan 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
;
Sekarang mari kita periksa apa yang kita dapatkan:
select * from a_y;
A IDS
------------------------- ---------------------------------------------------------
atveroeosipsum atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test stetclitakasdtest
stetclitakasd stetclitakasdtest
noseatakimata noseatakimataatveroeosipsum
loremipsumdolor atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr consetetursadipscingelitr
EDIT #2
Jika Anda perlu menggabungkan id dari tabel a_x
(kolom b
), bukan CLOB itu sendiri, lalu ganti t1.a
dengan t1.b
(dan, dalam ORDER BY
klausa XMLAGG
, Anda tidak memerlukan cast
, cukup 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