Nếu bạn có Oracle 11g, bạn có thể sử dụng hàm LISTAGG, như sau:
Insert into NEW_TFIDF_TABLE
SELECT T.ID, T.TERMS ||', '|| LISTAGG(TT.TERMS, ',')
FROM TFIDF_TABLE T
INNER JOIN TERMS_TABLE TT ON T.ID=TT.ID
GROUP BY t.ID, t.TERMS /* assuming the id is unique in t */
Nếu bạn đang sử dụng phiên bản cũ hơn, bạn có thể tạo các hàm tổng hợp của riêng mình bằng cách sử dụng một gói. Tôi đã xây dựng hàm FNC_CONCATCOMMASEPARATED này, mà tôi thường tự sử dụng.
CREATE OR REPLACE TYPE "AT_CONCATCOMMASEPARATED" as object
(
V_CONCAT varchar2(32767), -- concatenated strings
static function ODCIAggregateInitialize(
P_CONTEXT in out AT_CONCATCOMMASEPARATED)
return number,
member function ODCIAggregateIterate(
self in out AT_CONCATCOMMASEPARATED,
P_VALUE in varchar2)
return number,
member function ODCIAggregateTerminate(
self in AT_CONCATCOMMASEPARATED,
P_RESULT out varchar2,
P_FLAGS in number)
return number,
member function ODCIAggregateMerge(
self in out AT_CONCATCOMMASEPARATED,
P_CONTEXT in AT_CONCATCOMMASEPARATED)
return number
);
create or replace type body AT_CONCATCOMMASEPARATED is
static function ODCIAggregateInitialize(
P_CONTEXT in out AT_CONCATCOMMASEPARATED)
return number
is
begin
if P_CONTEXT is null then
P_CONTEXT := AT_CONCATCOMMASEPARATED('');
else
P_CONTEXT.V_CONCAT := null;
end if;
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(
self in out AT_CONCATCOMMASEPARATED,
P_VALUE in varchar2)
return number
is
begin
if self.V_CONCAT is null then
self.V_CONCAT := P_VALUE;
else
self.V_CONCAT := self.V_CONCAT || ', ' || P_VALUE;
end if;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(
self in AT_CONCATCOMMASEPARATED,
P_RESULT out varchar2,
P_FLAGS in number)
return number
is
begin
P_RESULT := substr(self.V_CONCAT, 0, 4000);
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(
self in out AT_CONCATCOMMASEPARATED,
P_CONTEXT in AT_CONCATCOMMASEPARATED)
return number
is
begin
if P_CONTEXT.V_CONCAT is not null then
if self.V_CONCAT is null then
self.V_CONCAT := P_CONTEXT.V_CONCAT;
else
self.V_CONCAT := self.V_CONCAT || ', ' || P_CONTEXT.V_CONCAT;
end if;
end if;
return ODCIConst.Success;
end;
end;
create or replace function FNC_CONCATCOMMASEPARATED (input varchar2) return varchar2
aggregate using AT_CONCATCOMMASEPARATED;
Khi đó câu lệnh insert trở thành:
Insert into NEW_TFIDF_TABLE
SELECT T.ID, T.TERMS ||', '|| FNC_CONCATCOMMASEPARATED(TT.TERMS)
FROM TFIDF_TABLE T
INNER JOIN TERMS_TABLE TT ON T.ID=TT.ID
GROUP BY t.ID, t.TERMS /* assuming the id is unique in t */