sql >> データベース >  >> RDS >> Oracle

内部結合2つのテーブル、varcharフィールドを集約

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


    1. Postgresql COPY TO STDIN with CSVは、競合時にどのように更新しますか?

    2. データベース接続情報を保存する方法は安全ですか?

    3. Mysqlのビットタイプを休止状態にマップするにはどうすればよいですか?

    4. mysql innodbバッファプールをクリア/フラッシュする方法は?