根据同一表中其他行的值更新多行

时间:2013-09-15 12:04:54

标签: sql oracle

我需要根据匹配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(其他表中的ID),我需要更新SubID = 2的值,SubId = 3的值

结果应该是(基于以上所述):

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)

2 个答案:

答案 0 :(得分: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上的条件移动到外部查询更有效。

答案 1 :(得分: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