Oracle - 复杂的更新

时间:2014-02-28 02:30:29

标签: sql oracle merge sql-update

我有两个表,它们会在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排序,然后每5行以递增1(从0开始)更新BATCH列。

这是我到目前为止所做的:

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行,但我希望所有行都要更新。

我非常感谢有关如何实现预期的一些见解。我希望我没有错过任何东西。

1 个答案:

答案 0 :(得分: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);