0

IDが一致する他の行の値に基づいて複数の行を更新する必要があります。

テーブル構造:

ID   |    Sub-ID | value
----------------------------
1    |      1    |    a
1    |      2    |    b
1    |      3    |    c
2    |      1    |    x
2    |      2    |    y
2    |      3    |    z
3    |      1    |    k
3    |      2    |    l
3    |      3    |    m

特定の ID の SubID = 2 の値を SubId=3 の値で更新する必要があります (ID は他のテーブルにあります)。

結果は(上記に基づいて)次のようになります。

ID   |    Sub-ID | value
----------------------------
1    |      1    |    a
1    |      2    |    c
1    |      3    |    c
2    |      1    |    x
2    |      2    |    y
2    |      3    |    z
3    |      1    |    k
3    |      2    |    m
3    |      3    |    m

それを実装する最も効率的な方法は何ですか?

これは私が今持っているものです:

UPDATE data_tab tab1
   SET (value) =
          (SELECT tab2.value
             FROM data_tab tab2
            WHERE tab1.id = tab2.id 
              AND tab1.sub_id = 2 AND tab2.sub_id = 3 
              )      
 WHERE EXISTS (SELECT 1    FROM ids_table 
                WHERE id = tab1.id)
4

2 に答える 2

1

あなたの質問に対する答えは次のようなものです。

UPDATE data_tab tab1
   SET value = (SELECT tab2.value
                FROM data_tab tab2
                WHERE tab1.id = tab2.id AND
                      tab2.sub_id = 3
              )
   WHERE tab1.id in (select id from ids_table) and
         tab1.sub_id = 2;

つまり、元のクエリは問題ありません。sub_id = 2条件を外側のクエリに移動する方が効率的だと思います。

于 2013-09-15T12:09:26.493 に答える
1

あなたが行ったことは問題ないようです。何が起こっても、これらのテーブル スキャンを実行する必要があります。MERGE ステートメントを使用すると、より高速になる可能性があります (見た目もすっきりします)。

merge into data_tab o
using ( select id, value
          from data_tab a
          join ids_table b
            on a.id = b.id
         where a.subid = 3
               ) n
   on ( o.id = n.id )
 when matched then
      update
         set o.value = n.value
       where o.subid = 2
于 2013-09-15T12:10:24.797 に答える