sql >> Base de Datos >  >> RDS >> Oracle

La palabra clave FROM no se encuentra donde se esperaba, selección de texto Oracle SQL

El error inmediato es causado por tener dos alias dados al resultado de la concatenación:Tienes AS LIST as ids . No puede dar dos alias al resultado de un cálculo. Si desea que la tabla recién creada tenga una columna LIST luego elimine as ids y viceversa.

Entonces te encontrarás con otro error:estás intentando ORDER BY t1.a en la agregación. Eso no funcionará; no puede ordenar por un CLOB en la agregación XML. ¿Realmente te importa en qué orden ocurre la agregación? Si no lo hace, cambie a ORDER BY NULL . Si te importa, tienes un problema, ya que en Oracle un order_by_clause simplemente no puede ordenar por una expresión CLOB. Tendrá que crear una columna separada para ordenar utilizando otros métodos.

En la solución general, no hay necesidad de la cláusula CON. Siempre que se refiera a "cadenas_de_entrada" en la consulta (aparte de la cláusula WITH), simplemente escriba "expresiones_de_tabla".

EDITAR

Así es como se podría hacer que esto funcione. Primero mostraré las sentencias CREATE TABLE. Asumiré que table_expressions tiene una columna CLOB de cadenas de búsqueda y que NO HAY DUPLICADOS en esta columna. Aun así, la tabla también necesita una clave principal separada, de un tipo de datos que no sea LOB u otro tipo largo, no estándar. Uso NÚMERO para esto.

Luego agrego por esta columna de clave principal. Por desgracia, no puedo seleccionar la cadena de búsqueda al mismo tiempo. Podría SELECT MAX(t2.a) ¡pero eso tampoco funciona con valores CLOB! En cambio, necesito una unión adicional para hacer coincidir la clave principal con la cadena de búsqueda. (Lo siento, la consulta tardará mucho más debido a esto...)

En la agregación, ordeno por los primeros 4000 caracteres del valor de cadena de la columna a . Esto no es tan bueno como ordenar por toda la cadena de entrada, pero es mejor que ordenar por 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
;

Ahora veamos lo que tenemos:

select * from a_y;

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

EDITAR #2

Si necesita concatenar las identificaciones de la tabla a_x (columna b ), no los CLOB en sí, luego reemplace t1.a con t1.b (y, en el ORDER BY cláusula de XMLAGG , no necesitas ningún cast , solo 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