sql >> Databasteknik >  >> RDS >> Oracle

FRÅN nyckelord hittades inte där det förväntades, textval Oracle SQL

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



  1. Sqlite-databas uppdaterar en rad android

  2. SQLAlchemy flera främmande nycklar i en mappad klass till samma primärnyckel

  3. Vad är skillnaden mellan INNER JOIN, LEFT JOIN, RIGHT JOIN och FULL JOIN?

  4. MYSQLI förberedd uttalande ger ingen utmatning