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