Se hai Oracle 11g, puoi utilizzare la funzione LISTAGG, in questo modo:
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 */
Se utilizzi una versione precedente, puoi creare le tue funzioni aggregate utilizzando un pacchetto. Ho creato questa funzione FNC_CONCATCOMMASEPARATED, che uso frequentemente io stesso.
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;
L'istruzione insert diventa quindi:
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 */