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=3 值更新 SubID = 2 的值(其中 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 回答