2014-02-28 106 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来做。 –