Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Từ khóa FROM không được tìm thấy ở nơi mong đợi, lựa chọn văn bản Oracle SQL

Lỗi ngay lập tức là do có hai bí danh được cung cấp cho kết quả của việc ghép nối:Bạn có AS LIST as ids . Bạn không thể cung cấp hai bí danh cho kết quả của một phép tính. Nếu bạn muốn bảng mới tạo có một cột LIST sau đó xóa as ids và ngược lại.

Sau đó, bạn sẽ gặp phải một lỗi khác:bạn đang cố gắng ORDER BY t1.a trong tập hợp. Điều đó sẽ không hoạt động; bạn không thể sắp xếp theo CLOB trong tập hợp XML. Bạn có thực sự quan tâm đến việc tổng hợp xảy ra theo thứ tự nào không? Nếu không, hãy đổi thành ORDER BY NULL . Nếu bạn quan tâm, bạn gặp sự cố, vì trong Oracle có order_by_clause đơn giản là không thể sắp xếp theo một biểu thức CLOB. Bạn sẽ phải tạo một cột riêng để đặt hàng bằng các phương pháp khác.

Trong tổng thể giải pháp, không cần mệnh đề WITH. Bất cứ nơi nào bạn tham chiếu đến "input_strings" trong truy vấn (ngoài mệnh đề WITH), chỉ cần viết "table_expressions".

CHỈNH SỬA

Đây là cách điều này có thể được thực hiện để hoạt động. Đầu tiên, tôi sẽ hiển thị các câu lệnh CREATE TABLE. Tôi sẽ giả định rằng table_expressions có một cột CLOB của các chuỗi tìm kiếm và KHÔNG CÓ KÉO DÀI trong cột này. Ngay cả như vậy, bảng cũng cần một khóa chính riêng biệt, thuộc kiểu dữ liệu không phải LOB hoặc kiểu dài, không phải là tiêu chuẩn khác. Tôi sử dụng NUMBER cho việc này.

Sau đó tôi tổng hợp theo cột khóa chính này. Than ôi, tôi không thể chọn chuỗi tìm kiếm cùng một lúc. Tôi có thể SELECT MAX(t2.a) nhưng điều đó cũng không hoạt động với các giá trị CLOB! Thay vào đó, tôi cần một phép nối khác để khớp khóa chính với chuỗi tìm kiếm. (Xin lỗi, truy vấn sẽ mất nhiều thời gian hơn vì điều này ...)

Trong tổng hợp, tôi sắp xếp theo 4000 ký tự đầu tiên của giá trị chuỗi từ cột a . Điều này không tốt bằng sắp xếp theo toàn bộ chuỗi đầu vào, nhưng vẫn tốt hơn sắp xếp theo 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
;

Bây giờ, hãy kiểm tra xem chúng ta đã có những gì:

select * from a_y;

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

CHỈNH SỬA # 2

Nếu bạn cần nối id từ bảng a_x (cột b ), không phải chính CLOB, sau đó thay thế t1.a với t1.b (và, trong ORDER BY mệnh đề của XMLAGG , bạn không cần bất kỳ cast nào , chỉ cần 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. Ví dụ về Thu thập số lượng lớn Oracle PL / SQL với Lưu ngoại lệ

  2. ORA-00936:thiếu biểu thức tiên tri

  3. SQL (oracle) để so sánh hai danh sách

  4. Làm thế nào để biến 2 truy vấn có cột chung (A, B) và (A, C) thành chỉ một (A, B, C)?

  5. Nội năng của bảng KÉP?