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

クエリの更新 - Oracle

    あなたが望んでいると思います

    UPDATE table1 cs
       SET cs.abc = (SELECT tc.abc
                       FROM table2 cgl,
                            table3 tc
                      WHERE cgl.prd_id       = tc.prd_id
                        AND cgl.prd_ver      = tc.prd_ver
                        AND cgl.py_id        = tc.py_id
                        AND cgl.typ_id       = tc.tpy_id
                        AND cd.common_column = cgl.common_column)
     WHERE EXISTS (SELECT 1
                     FROM table2 cgl,
                          table3 tc
                    WHERE cgl.prd_id       = tc.prd_id
                      AND cgl.prd_ver      = tc.prd_ver
                      AND cgl.py_id        = tc.py_id
                      AND cgl.typ_id       = tc.tpy_id
                      AND cd.common_column = cgl.common_column)
    

    更新:列とテーブルの名前の変更を除いて、私の最初の回答は、投稿したサンプル データで機能するようです。データを DDL と DML に変換するよりも、DDL と DML を投稿してテーブルとデータを再現できるようにする方が常に簡単です。

    私があなたのテーブルとデータを作成した場合

    SQL> create table table1 (
      2    prd_id number,
      3    prd_ver number,
      4    py_id number,
      5    typ_id number,
      6    column_used_for_update varchar2(10)
      7  );
    
    Table created.
    
    SQL> begin
      2    insert into table1 values( 1, 1, 1, 1, 'VALUE1' );
      3    insert into table1 values( 2, 3, 4, 5, 'VALUE2' );
      4  end;
      5  /
    
    PL/SQL procedure successfully completed.
    
    SQL> create table table2 (
      2    prd_id number,
      3    prd_ver number,
      4    py_id number,
      5    typ_id number,
      6    common_column varchar2(10)
      7  );
    
    Table created.
    
    SQL> begin
      2    insert into table2 values( 1, 1, 1, 1, 'A' );
      3    insert into table2 values( 1, 1, 1, 1, 'B' );
      4    insert into table2 values( 2, 3, 4, 5, 'C' );
      5  end;
      6  /
    
    PL/SQL procedure successfully completed.
    
    SQL> create table table3 (
      2    common_column varchar2(10),
      3    column_to_update varchar2(10)
      4  );
    
    Table created.
    
    SQL> begin
      2    insert into table3 values( 'A', null );
      3    insert into table3 values( 'B', null );
      4    insert into table3 values( 'C', null );
      5  end;
      6  /
    
    PL/SQL procedure successfully completed.
    
    SQL> commit;
    
    Commit complete.
    

    次に、最初の回答からテーブルと列の名前を調整します。更新が正しく機能しているようです

    SQL> ed
    Wrote file afiedt.buf
    
      1  UPDATE table3 t3
      2     SET t3.column_to_update = (
      3                   SELECT t1.column_used_for_update
      4                     FROM table2 t2,
      5                          table1 t1
      6                    WHERE t1.prd_id        = t2.prd_id
      7                      AND t1.prd_ver       = t2.prd_ver
      8                      AND t1.py_id         = t2.py_id
      9                      AND t1.typ_id        = t2.typ_id
     10                      AND t3.common_column = t2.common_column)
     11   WHERE EXISTS (  SELECT 1
     12                     FROM table2 t2,
     13                          table1 t1
     14                    WHERE t1.prd_id        = t2.prd_id
     15                      AND t1.prd_ver       = t2.prd_ver
     16                      AND t1.py_id         = t2.py_id
     17                      AND t1.typ_id        = t2.typ_id
     18*                     AND t3.common_column = t2.common_column)
    SQL> /
    
    3 rows updated.
    
    SQL> select * from table3;
    
    COMMON_COL COLUMN_TO_
    ---------- ----------
    A          VALUE1
    B          VALUE1
    C          VALUE2
    



    1. ペルシア語\アラビア語のテキストをmysqlデータベースに保存する

    2. SQL文字列の比較、大なり小なり演算子

    3. テーブルに存在しないレコードを返します

    4. PostgreSQLはスカラーでjson_object_keysを呼び出すことができません