2011-10-25 29 views
0

對不起,我改變了一下我的問題。 我有兩個表,我想將它們合併內部加入兩個表,聚合varchar字段

TERMS_TABLE 

ID | TERMS 
309 | 'hardware' 
309 | 'software' 

TFIDF_TABLE 

    ID | TERMS 
309 |'computer,phone,mp3....' 

現在我想的TERMS_TABLE條款列添加到這樣的

結果TFIDF_TABLE方面欄應該是:

NEW_TFIDF_TABLE 

    ID | TERMS 
309 |'computer,phone,mp3....,hardware,software' 

我試試這個代碼:

Insert into NEW_TFIDF_TABLE 
SELECT T.ID, T.TERMS ||', '|| TT.TERMS FROM TFIDF_TABLE T 
INNER JOIN TERMS_TABLE TT ON T.ID=TT.ID 

但它不會做我想要的 我該怎麼做?

修改:我忘了問題。如果TFIDF_TABLE已經包含TERMS_TABLE 的TERMS,那麼我不應該將這個術語插入NEW_TFIDF_TABLE。要做到這一點控制機制,我該怎麼做?

實施例:

TERMS_TABLE

ID | TERMS 
309 | 'hardware' 
309 | 'software' 
309 | 'computer' 



TFIDF_TABLE 

    ID | TERMS 
309 |'computer,phone,mp3....' 

結果:

NEW_TFIDF_TABLE

ID | TERMS 
309 |'computer,phone,mp3....,hardware,software' 
+1

什麼結果你得到這個?因爲它似乎是正確的 – shanmugamgsn

+0

我得到結果:NEW_TFIDF_TABLE ID |條款309'電腦,手機,mp3 ....,硬件'309 |'電腦,手機,mp3 ....,軟件' – user951487

+0

@shanmugamgsn正如你所看到的,他試圖彙總這些條款。 – GolezTrol

回答

0

使用(可與Oracle 9i和向上):

INSERT INTO NEW_TFIDF_TABLE (ID, TERMS) 
SELECT DISTINCT 
TT.ID, 
T.TERMS || ',' || XMLAGG (XMLELEMENT (C, TT.TERMS) ORDER BY TT.TERMS ASC).EXTRACT ('//text()') , ',') AS TERMS 
FROM TFIDF_TABLE T 
INNER JOIN TERMS_TABLE TT ON T.ID=TT.ID 
4

如果你有甲骨文11g中,你可以使用LISTAGG功能,像這樣:

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 */ 

如果您使用的是較早的版本,你可以使用一個包創建自己的聚合函數。我已經構建了這個FNC_CONCATCOMMASEPARATED函數,我很快使用自己。

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; 

insert語句就變成了:

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 */ 
+0

請注意,這個函數可以連接的最大長度(我相信4000個字符)。 – GolezTrol

+0

事實上,TERMS_TABLE中的id不唯一TT – user951487

+0

例如,它包含ID 309 – user951487