假设我有这些数据:
ID | NAME | FRUIT
--------------------------
1 | abc_v1 | apple
2 | abc_v2 | banana
3 | abc_v3 | cherry
4 | xyz_v1 | banana
5 | xyz_v2 | grape
6 | xyz_v3 | apple
对于每一行,我想将FRUIT列中的值替换为FRUIT列中具有最小ID的行中的任何内容,其中NAME的前四个字符相同。
因为前三行都有一个以“abc_”开头的NAME,我希望所有这三行在FRUIT列中都有“apple”,因为这是ID最低的值。同样,我希望最后三行在FRUIT列中都具有值“banana”,这是第4行中的FRUIT值,即NAME以“xyz _”开头的最低ID。
我真正的桌子有16K行。每个都有一个唯一的ID,每个都有一个NAME,它以与零个或多个其他行相同的四个字符开头。
在非常糟糕的伪代码中,我想要这样的东西:
UPDATE MYTABLE SET FRUIT =
(SELECT FRUIT FROM MYTABLE WHERE ID =
(SELECT MIN(ID) FROM MYTABLE WHERE NAME LIKE
[some way to represent first four characters]%));
我可以在Oracle的单个SQL更新语句中执行此操作吗?我被困在上面括号中;我觉得我需要一个遍历所有行的变量,这让我觉得我可能需要一个PL / SQL程序。
非常感谢帮助。谢谢!
答案 0 :(得分:1)
假设id
是MYTABLE
MERGE INTO MYTABLE m
USING (
SELECT m.*,
first_value( fruit )
over (partition by substr(name,1,4) order by id ) As new_fruit
FROM MYTABLE m
) x
ON (x.id = m.id )
WHEN MATCHED THEN UPDATE SET m.fruit = x.new_fruit;