sql >> Database >  >> RDS >> Oracle

FROM trefwoord niet gevonden waar verwacht, tekstselectie Oracle SQL

De directe fout wordt veroorzaakt doordat er twee aliassen zijn gegeven aan het resultaat van de aaneenschakeling:U hebt AS LIST as ids . U kunt geen twee aliassen geven aan het resultaat van een berekening. Als u wilt dat de nieuw gemaakte tabel een kolom heeft LIST verwijder vervolgens as ids , en vice versa.

Dan kom je een andere fout tegen:je probeert te ORDER BY t1.a in de aggregatie. Dat zal niet werken; u kunt niet bestellen door een CLOB in de XML-aggregatie. Maakt het je echt uit in welke volgorde de aggregatie gebeurt? Als je dat niet doet, verander dan naar ORDER BY NULL . Als het je kan schelen, heb je een probleem, aangezien in Oracle een order_by_clause kan eenvoudigweg niet op een CLOB-expressie bestellen. U moet een aparte kolom maken om te bestellen door andere methoden te gebruiken.

In de algemene oplossing is de WITH-clausule niet nodig. Waar je ook verwijst naar "input_strings" in de query (behalve de WITH-clausule), schrijf gewoon "table_expressions".

BEWERKEN

Hier is hoe dit zou kunnen worden gemaakt om te werken. Eerst zal ik de CREATE TABLE-statements laten zien. Ik ga ervan uit dat table_expressions een CLOB-kolom met zoekreeksen heeft en dat er GEEN DUPLICATES in deze kolom staan. Toch heeft de tabel ook een aparte primaire sleutel nodig, van een gegevenstype dat niet LOB is of een ander lang, niet-standaardtype. Ik gebruik hiervoor NUMBER.

Dan verzamel ik door deze primaire sleutelkolom. Helaas kan ik de zoekreeks niet tegelijkertijd selecteren. Ik zou kunnen SELECT MAX(t2.a) maar dat werkt ook niet met CLOB-waarden! In plaats daarvan heb ik nog een join nodig om de primaire sleutel met de zoekreeks te matchen. (Sorry, de zoekopdracht duurt hierdoor veel langer...)

In de aggregatie sorteer ik op de eerste 4000 tekens van de tekenreekswaarde uit kolom a . Dit is niet zo goed als sorteren op de hele invoerreeks, maar het is nog steeds beter dan bestellen op 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
;

Laten we nu eens kijken wat we hebben:

select * from a_y;

A                          IDS
-------------------------  ---------------------------------------------------------
atveroeosipsum             atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test                       stetclitakasdtest
stetclitakasd              stetclitakasdtest
noseatakimata              noseatakimataatveroeosipsum
loremipsumdolor            atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr  consetetursadipscingelitr

BEWERK #2

Als u de id's uit tabel a_x . moet samenvoegen (kolom b ), niet de CLOB's zelf, vervang dan t1.a met t1.b (en, in de ORDER BY clausule van XMLAGG , je hebt geen cast nodig , gewoon 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. mysql2.so:libmysqlclient_r.so.15:kan het gedeelde objectbestand niet openen:geen dergelijk bestand of map

  2. Maak een bewerkbare weergave op Oracle

  3. Waarom is er een maximale lengte voor opgeslagen procedurenamen?

  4. Kan lib '/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1 niet openen bij het maken van een Database Monitor-item in zabbix