我需要根据匹配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)
答案 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