Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

FROM kata kunci tidak ditemukan di tempat yang diharapkan, pemilihan teks Oracle SQL

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah ada cara untuk memilih beberapa baris dengan menggunakan parameter?

  2. Hapus cache level 2 Hibernate setelah pembaruan DB secara manual

  3. Daftar nama kolom untuk tampilan pengguna di Oracle

  4. Pemicu alternatif untuk dua tabel yang harus saling memperbarui

  5. Bagaimana cara mengganti nilai yang dipisahkan koma di kolom tabel dengan nilai input pengguna oracle