2014-02-28 103 views
0

我有兩個表,將相同的密鑰存儲在ID欄:甲骨文 - 複雜更新

CREATE TABLE "TESTA" 
    ( "RECORD_STATUS" VARCHAR2(4 BYTE), 
    "ID" NUMBER, --this is PK 
    "BATCH" NUMBER 
    ); 
CREATE TABLE "TESTB" 
    ( "ID" NUMBER, --this is unique FK to TESTA.ID 
    "BATCH" NUMBER); 

我在這些測試表中插入一些20測試記錄。

要求:使用ID加入兩個表,使用TESTA.RECORD_STATUS DESC排序,然後更新BATCH列,每5行增加1(從0開始)。

這是我到目前爲止有:

MERGE INTO TESTB st 
USING(SELECT A.rowid as rid, 
      ROW_NUMBER() OVER (ORDER BY A.RECORD_STATUS DESC) as rn 
     FROM TESTA A) t 
ON(st.ROWID=t.RID) 
WHEN MATCHED THEN 
UPDATE SET st.BATCH=CEIL(t.rn/5); 

問題:輸出0表示合併行,但我期待所有行到更新。

我非常感謝一些有關如何實現預期的見解。我希望我沒有錯過任何東西。

+0

的ROWID是一個唯一的地址爲每個記錄。您不會期望一個表中的行中的ROWID與任何其他表中的任何ROWID匹配。 –

回答

1

您可以用update做到這一點:

update testb 
    set b.batch = (select trunc((seqnum - 1)/5) 
        from (select a.*, row_number() over (order by a.record_status desc) as seqnum 
         from testa 
         ) a 
        where a.id = testb.id and 
       ) 
    where exists (select 1 from testa a where a.id = testb.id); 
+0

@ user3224907。 。 。我想是這樣。你可以用'update'做任何事情,你應該可以用merge來做。 –