列以SQL开头的Oracle SQL更新语句

时间:2016-03-07 20:40:13

标签: sql oracle sql-update

假设我有这些数据:

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程序。

非常感谢帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

假设idMYTABLE

中的主键
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;