sql >> Database teknologi >  >> RDS >> Oracle

FRA nøgleord ikke fundet hvor det forventes, tekstvalg Oracle SQL

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



  1. SOUNDEX() Funktion i Oracle

  2. Brugerkontostyring, roller, tilladelser, autentificering PHP og MySQL

  3. MySQL 17,6 m rækker (1,2 gb) opdatering af fuld bord er for langsom

  4. MYSQL Query - Hvordan viser man korrekte værdier, ikke blobs, ved at lave CONCAT og oprette en ny kolonne med korrekte multiplicerede totalværdier?