2016-03-07 41 views
0

比方說,我有這樣的數據:的Oracle SQL update語句,其中列有X啓動

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 

對於每一行,我想在水果列無論是該行,以取代在水果列中的值NAME中前四個字符相同的最小ID。

因此,由於前三行都有一個以「abc_」開頭的NAME,我希望所有這三行在FRUIT列中都有「apple」,因爲這是ID最低的值。同樣,我希望最後三行的FRUIT列中的值爲「banana」,這是行4中的FRUIT值,NAME以「xyz_」開頭的最低ID。

我的真實表格有16K行。每個都有一個唯一的ID,並且每個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]%)); 

我能做到這一點,在甲骨文單個SQL更新語句?我被困在上面括號中的部分;我覺得我需要一個循環遍歷所有行的變量,這讓我想也許我需要一個PL/SQL程序。

非常感謝幫助。謝謝!

+0

主鍵WHERE水果LIKE SUBSTR(水果,1,4)|| '%' – kevinsky

回答

1

Assumming即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; 
+0

這正是我需要的。謝謝! – Erica