Inner Join Two Table, объединяющая поля varchar - PullRequest
0 голосов
/ 25 октября 2011

Извините, я немного изменил свой вопрос. У меня есть две таблицы, и я хочу объединить их

  TERMS_TABLE

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

TFIDF_TABLE

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

Теперь я хочу добавить столбец TERMS 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 тогда я не должен вставлять этот термин в 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'

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Если у вас есть Oracle 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 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 голосов
/ 25 октября 2011

использование (работает с 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
...