2014-04-29 100 views
0

我有以下查詢,它根據查詢中提到的條件更新rec_tmprecord表的coulmn「tmp_activation_date」和最大的actdate。在Oracle查詢中加入條件

MERGE INTO rec_tmprecord 
    USING (SELECT rec.ID, MAX (act.actdate) AS tmpactivation_date 
       FROM rec_tmprecord rec INNER JOIN tmp_asset asset 
        ON asset.serial = rec.serialtemp 
        and upper (replace (asset.prodname, 'Ajink ')) = upper (replace (rec.prodnametemp, 'Ajink ')) 
        and NVL(asset.release,'NF') = NVL(rec.tmprelease ,'NF') 
        and rec.serialtemp != 'aaa-aaaaaaaa'     
        LEFT JOIN tmp_acti_hist act 
        ON asset.tmp_id = act.tmp_row_id 
      WHERE rec.cust_id = 234567 
      GROUP BY rec.cust_id,asset.serial,rec.ID) new_values 
    ON (rec_tmprecord.ID = new_values.ID) 
    WHEN MATCHED THEN 
     UPDATE 
     SET tmp_activation_date = new_values.tmpactivation_date 
     ; 

但是,當我分析表「rec_tmprecord」的數據,我發現,有存在於「rec_tmprecord」 table.But,列「PRODNAME」的「prodnametemp」列中的某些空值或空值表「tmp_asset」不包含任何空值或空值。 (替換(asset.prodname,'Ajink'))= upper(replace(rec.prodnametemp,'Ajink'))「條件並且因此rec_tmprecord表的結果」tmp_activation_date「將會失敗用空值或空白值更新。

我的要求是,如果「prodnametemp」具有空值並且「prodname」包含某個值,那麼「tmpactivation_date」將根據查詢中提到的其他條件進行計算。 Anyhelp對此將不勝感激。

+0

'tmp_activation_date'在該場景下不會更新爲'null';你不會在'using'部分有一行 - 連接條件失敗,所以沒有任何東西可以匹配? –

回答

1

這裏是一個修改後的版本。我修改瞭如下連接:

upper (replace (asset.prodname, 'Ajink ')) = NVL(upper (replace (rec.prodnametemp, 'Ajink ')), upper (replace (asset.prodname, 'Ajink '))) 

編輯: 連接條件已經被壓縮,感謝Alex普爾的建議。

基本上,如果是NULL,那麼該條件將返回TRUE,因爲那麼asset.prodname = asset.prodname。

MERGE INTO rec_tmprecord 
    USING (SELECT rec.ID, MAX (act.actdate) AS tmpactivation_date 
       FROM rec_tmprecord rec INNER JOIN tmp_asset asset 
        ON asset.serial = rec.serialtemp 
        and upper (replace (asset.prodname, 'Ajink ')) = upper (replace (NVL (rec.prodnametemp, asset.prodname), 'Ajink ')) 
        and NVL(asset.release,'NF') = NVL(rec.tmprelease ,'NF') 
        and rec.serialtemp != 'aaa-aaaaaaaa'     
        LEFT JOIN tmp_acti_hist act 
        ON asset.tmp_id = act.tmp_row_id 
      WHERE rec.cust_id = 234567 
      GROUP BY rec.cust_id,asset.serial,rec.ID) new_values 
    ON (rec_tmprecord.ID = new_values.ID) 
    WHEN MATCHED THEN 
     UPDATE 
     SET tmp_activation_date = new_values.tmpactivation_date 
     ; 
+0

保存了一些輸入......但爲了簡潔起見,我會在右側的'replace'中放置'NVL':'= upper(replace(nvl(rec.prodnametemp,asset.prodname),' Ajink'))'。雖然功能相同! –

+0

+1 @AlexPoole是的,這是一個很好的建議! –