2016-08-24 52 views
1

我有結構的記錄table1的像的Oracle SQL更新使用組由/殼體

KEY1 KEY2 KEY3 EMPLID ENRCD ADDL_SEQ ... 

with (KEY1 KEY2 KEY3 EMPLID ENRCD ADDL_SEQ) being keys 

我有其中EMPLID & ERNCD是我想遞增KEY1的相同,但不同的值/ 2/3 行通過1 ADDL_SEQ值時爲相同EMPLID & ERNCD

例如

- KEY1 KEY2 KEY3 EMPLID ERNCD ADDL_SEQ 
    001 A1 B1 12345 REG 1 
    001 A1 B2 12345 REG 2 

UPDATED SQL 
UPDATE PS_XX_PY40_APAY_1 A1 
SET A1.ADDL_SEQ = 
(
    SELECT RANK() OVER(PARTITION BY XX_EMPLOYEE_ID,ERNCD ORDER BY 
    XX_CONVERSION_ID,XX_UCPATH_LOC,XX_WRKR_INSTANCE,XX_APPT_NUM,XX_DIST_NUM,EMPL_RCD,EMPLID,EFFDT) 
    FROM PS_XX_PY40_APAY_1 B1 
    WHERE B1.XX_EMPLOYEE_ID=A1.XX_EMPLOYEE_ID 
    and B1.ERNCD=A1.ERNCD 
    AND XX_CONVERSION_ID=XX_CONVERSION_ID 
    AND XX_UCPATH_LOC=XX_UCPATH_LOC 
    AND A1.XX_WRKR_INSTANCE=B1.XX_WRKR_INSTANCE 
    AND B1.XX_APPT_NUM=A1.XX_APPT_NUM 
    AND B1.XX_DIST_NUM=A1.XX_DIST_NUM 
    AND A1.EMPLID=B1.EMPLID 
    AND A1.EMPL_RCD=B1.EMPL_RCD 
    AND A1.EFFDT=B1.EFFDT 
); 

WHERE所有存在多行鑰匙已連接。然而,結果不理想

結果

004720864 RGN 1 
004720864 RGN 1 
004720864 RGN 1 
004720864 RGN 1 

預計

004720864 RGN 1 
    004720864 RGN 2 
    004720864 RGN 3 
    004720864 RGN 4 
+0

'B1.ERNCD = A1.ERNCD' ...錯字了'B1.ENRCD = A1.ENRCD ' –

+0

Opps。謝謝。但它沒有奏效。請參閱最新的結果。其他KEY不需要匹配,但XX_EMPLOYEE_ID和ERNCD應該用於增加ADDL_SEQ –

回答

1

的問題,您update聲明,並且在Tim的答案中提出的一個是,他們沒有考慮rankrow_number分析函數的計算結果where子句已經已被應用。所以,實際上,分析函數是在單行上計算的,顯然總是會返回1。絕對不是你想要的。

這裏是執行使用merge聲明,應爲你工作的更新的方式:

merge into table1 dest 
using (
    select key1, key2, key3, emplid, enrcd, 
     row_number() over (partition by emplid, enrcd 
           order by key1, key2, key3) as addl_seq 
    from table1 
) src 
on (
    src.key1 = dest.key1 
    and src.key2 = dest.key2 
    and src.key3 = dest.key3 
    and src.emplid = dest.emplid 
    and src.enrcd = dest.enrcd 
) 
when matched then 
    update set dest.addl_seq = src.addl_seq 
1

這將產生你需要

select KEY1, KEY2, KEY3, EMPLID, ENRCD, 
     row_number() over(partition by EMPLID, ENRCD order by KEY1, KEY2, KEY3) as ADDL_SEQ 
from table1; 
0

如果你只是想選擇出的編號編號,那麼@Serg的答案應該沒問題。如果你想更新你的實際的表,那麼下面應該工作:

UPDATE yourTable t1 
SET t1.ADDL_SEQ = 
(
    SELECT ROW_NUMBER() OVER(PARTITION BY EMPLID, ENRCD ORDER BY KEY1, KEY2, KEY3) 
    FROM yourTable t2 
    WHERE t2.EMPLID = t1.EMPLID AND 
      t2.ENRCD = t1.ENRDC AND 
      t2.KEY1 = t1.KEY1 AND 
      t2.KEY2 = t1.KEY2 AND 
      t2.KEY3 = t1.KEY3 
) 

如果ADDL_SEQ列尚不存在,你可以通過創建它:

ALTER TABLE yourTable ADD ADDL_SEQ int; 
+0

@ user5702606使用'ROW_NUMBER()'而不是'RANK()' –

+0

同樣的結果。 ADDL_SEQ不增加 –