3

基準で (他のテーブルへの) 外部キーを必要とするテーブルを更新する最も効率的/最速の方法は何ですか?

私は通常、このようにします:

UPDATE table1 WHERE table1_id in (SELECT table1_id FROM table2 WHERE whatever)

しかし、サブクエリを回避するより効率的な方法があるかどうかを把握しようとしています。

私が知りたい理由は、昨日、次のようにサブクエリなしで削除できることを知ったからです。

DELETE t1 FROM table1 t1
JOIN table2 t2 ON t1.table1_id = t2.table1_id 
WHERE whatever

しかし、同じ JOIN 手法を UPDATE ステートメントに適用する方法がわかりません

4

3 に答える 3

2

これを試してみてください -

MS-SQL:

UPDATE t
SET column_id = t2.column_id
FROM table1 t
JOIN table2 t2 ON t.table1_id = t.table2_id 
WHERE whatever

オラクル:

UPDATE (
    SELECT table1.value as OLD, table2.CODE as NEW
    FROM table1
    JOIN table2 ON table1.value = table2.DESC
    WHERE anything
) t
SET t.OLD = t.NEW
于 2013-04-27T12:03:10.663 に答える
0

Oracle では、無制限の量のテーブルからフェッチできるカーソルに基づいて一括更新を実行できます。これが更新する最速の方法です。

declare
    cursor cur_cur
    IS
    select t1.rowid row_id, t2.column1, t2.column2
    FROM table1 t1
    JOIN table2 t2 ON t1.table1_id = t2.table1_id 
    WHERE whatever
    order by row_id
    ;

    type type_rowid_array is table of rowid index by binary_integer;
    type type_column1_array is table of table1.column1%type;
    type type_column2_array is table of table1.column2%type;

    arr_rowid type_rowid_array;
    arr_column1 type_column1_array;
    arr_column2 type_column2_array;

    v_commit_size number := 10000;

begin
    open cur_cur;

    loop
        fetch cur_cur bulk collect into arr_rowid, arr_column1, arr_column2 limit v_commit_size;

        forall i in arr_rowid.first .. arr_rowid.last
            update table1 tab
            SET    tab.column1 = arr_column1(i)
            ,      tab.column2 = arr_column2(i)
            where  tab.rowid = arr_rowid(i)
            ;

        commit;
        exit when cur_cur%notfound;

    end loop;

    close cur_cur;
    commit;

exception
  when others
    then rollback;
         raise_application_error(-20000, 'Fout bij uitvoeren update van table1(column1,column2) - '||sqlerrm);

end;
于 2013-04-27T12:42:48.987 に答える
0
UPDATE (
  SELECT t1.*
  FROM table1 t1
  JOIN table2 t2 ON t1.table1_id = t2.table1_id 
  WHERE whatever
) t
SET t.col = ...
于 2013-04-27T12:04:36.857 に答える