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

グループ関数を使用したOracleの更新ステートメント

    各テーブルにareaがある2つのレコードがあります 01です 、および主キーを満たすためにそれらを異なる値に設定する必要があります-2番目のテーブルの最大値または最小値の両方に設定することはできないため、実際にはグループ化を行いたくありません。

    同じareaを持つレコード間に他の順序はないようです 、したがって、これは任意であり、各areaのどのレコードでもかまいません。 どのbranch_codeを取得します 他のテーブルから。それが恣意的でない場合は、ルールを指定する必要があります...

    レコードのグループ内の任意の順序で一致させる必要がある場合、相関更新は注意が必要です。行の順序を特定する方法が必要ですが、row_number()を追加します インラインビューを作成するために元のテーブルに列を追加すると、ORA-01732エラーが発生します。

    ただし、ターゲットテーブルのrowidを使用することはできます 疑似列;新しいbranch_codeと同じ値を取得するには、相関関係で追加の結合を行う必要があります。 。次のようなもの:

    select bc.rid,
      bc.area,
      bc.branch_code,
      bc.branch_name,
      bc2.area,
      bc2.branch_code,
      bc2.branch_name
    from (
      select bc.*,
        bc.rowid as rid,
        row_number() over (partition by bc.area order by bc.branch_code) as rn
      from branch_cp bc
    ) bc
    join (
      select bc2.*,
        row_number() over (partition by bc2.area order by bc2.branch_code) as rn
      from branch_cp_2 bc2
    ) bc2
    on bc2.area = bc.area
    and bc2.rn = bc.rn;
    

    それはあなたに与えます:

    RID                AREA  BRANCH_CODE BRANCH_NAME AREA  BRANCH_CODE BRANCH_NAME
    ------------------ ----- ----------- ----------- ----- ----------- -----------
    AAAwy+AAEAAAA0DAAA 01    01          A           01    04          D           
    AAAwy+AAEAAAA0DAAB 01    02          B           01    05          E           
    AAAwy+AAEAAAA0DAAC 03    03          C           03    06          F           
    

    これらの列すべてが実際に必要なわけではなく、ridだけが必要です。 (branch_cp.rowid )および相関するbranch_cp_2.branch_code

    ただし、一致する場合にのみ更新する必要があります(他のテーブルに値がない行を無効にするため)。そのため、existsでその結合を繰り返す必要があります。 サブクエリ。

    mergeを行う方が簡単です :

    merge into branch_cp bc
    using (
      select bc.rid,
          bc2.branch_code
        from (
          select bc.*,
            bc.rowid as rid,
            row_number() over (partition by bc.area order by bc.branch_code) as rn
          from branch_cp bc
        ) bc
        join (
          select bc2.*,
            row_number() over (partition by bc2.area order by bc2.branch_code) as rn
          from branch_cp_2 bc2
        ) bc2
        on bc2.area = bc.area
        and bc2.rn = bc.rn
    ) bc2
    on (bc.rowid = bc2.rid)
    when matched then update set bc.branch_code = bc2.branch_code;
    
    3 rows merged.
    

    テーブルには次のものがあります:

    select * from branch_cp;
    
    AREA  BRANCH_CODE BRANCH_NAME
    ----- ----------- -----------
    01    04          A           
    01    05          B           
    03    06          C           
    

    SQLフィドル




    1. JPAエンティティ、Oracle 10g、およびカレンダータイプのプロパティに問題はありますか?

    2. MySQLの回避策テーブルを再度開くことができないというエラー

    3. Pythonを使用してMySQLに接続する方法

    4. Laravelのフォルダとデータベースからファイルや画像を削除する方法は?