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

同じSQLクエリでWITHステートメントとUPDATEステートメントを使用する

    アップデートではwith句を使用できます。適切な場所で行う必要があります:

    UPDATE mytable
       SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                                (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                               )
                   SELECT newvalue
                   FROM   temp
                   WHERE  mytable.name = temp.oldvalue);
    

    ただし、おそらくtempサブクエリに存在する行のみを更新する必要があるため、追加のwhere句が必要になります。

    UPDATE mytable
       SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                                (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                               )
                   SELECT newvalue
                   FROM   temp
                   WHERE  mytable.name = temp.oldvalue)
    WHERE  EXISTS (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                                (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                               )
                   SELECT NULL
                   FROM   temp
                   WHERE  mytable.name = temp.oldvalue);
    

    または、MERGEステートメントを使用します:

    merge into mytable tgt
      using (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                          (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                         )
             SELECT mytable.rowid r_id,
                    temp.newvalue
             FROM   temp
             inner  join mytable on mytable.name = temp.oldvalue) src
        on (tgt.rowid = src.r_id)
    when matched then
    update set tgt.name = src.newvalue;
    

    N.B.結合されている列を更新しようとしているため、マージステートメントのソースクエリで実際のテーブルに結合する必要があります。これは、マージステートメントでは実行できません。したがって、マージ結合をに切り替えました。 mytable.rowidに参加してください。

    両方のステートメントをテストして、どちらがデータに対して最もパフォーマンスが高いかを確認する必要があります。



    1. SQLServerデータベースの主キー制約とは-SQLServer/T-SQLチュートリアルパート54

    2. 日付範囲の重複チェック制約

    3. mysqlデータベースでMeteorフレームワークを使用できますか

    4. PHPでMySQL列の合計を取得する