If you got Oracle 11g, you can use the LISTAGG function, like so:
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 */
If you're on an earlier version, you can create your own aggregate functions using a package. I've build this FNC_CONCATCOMMASEPARATED function, which I freqently use myself.
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;
The insert statement then becomes:
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 */
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…