2013-11-14 48 views
0

我真的很困擾它們。使用連接更新多列的有效方法

該表需要更新約15M行和約200列。

我需要使用工作表格更新幾列。

這是(部分),我需要做的:

%macro condition; 

%if &row_count>0 %then %do; 

    data _null_;  
    set W4TWGKJ6 end=final;  
    if _n_ = 1 then call execute("proc sql ;");  
    call execute 
    ("update dds.insurance_policy set X_STORNO_BY_VERSION="||TOSNUM||" where  policy_no='"||cats(polid)||"' and X_INSURANCE_PRODUCT_CD='"||cats(prodid)||"' 
     and X_INSURER_SERIAL_NO = "||X_INSURER_SERIAL_NO||" and x_source_system_cd  ="||'"5"'||" and x_source_system_category_cd ="||'"5"'||" and x_current_ind  = "||'"Y"'||";,  

    update dds.insurance_policy set STATUS_CHANGE_DT="||ISSUE_DT||" where  policy_no='"||cats(polid)||"' and X_INSURANCE_PRODUCT_CD='"||cats(prodid)||"' 
     and X_INSURER_SERIAL_NO = "||X_INSURER_SERIAL_NO||" and x_source_system_cd  ="||'"5"'||" and x_source_system_category_cd ="||'"5"'||" and x_current_ind  = "||'"Y"'||";");  
    if final then call execute('quit;'); run; 


%end; 

%mend; 

%condition; 

我先檢查是否有表(& ROW_COUNT) 如果有行,

我更新2列(我需要更新5,我剛剛從示例中刪除了它們) 使用名爲W4TWGKJ6的工作表。

此更新需要永久。 事實上,我停止了每一次的過程,因爲它工作了幾個小時,沒有返回任何東西....

有沒有人知道這個問題的更好的解決方案?

在此先感謝, Gal。

回答

1

我建議在datastep中使用MODIFY語句: 對於BY變量,您應該在兩個表中都有相同的列名,並讓它們按這些變量排序。

data dds.insurance_policy; 
    modify 
     dds.insurance_policy 
     W4TWGKJ6 (keep= POLICY_NO X_INSURER_SERIAL_NO /* key variables */ 
         X_STORNO_BY_VERSION STATUS_CHANGE_DT /* ... other variables from source to update target */ 
     updatemode=nomissingcheck; 
    by POLICY_NO X_INSURER_SERIAL_NO; 

    if  _iorc_ = %sysrc(_SOK) then do; 
     * Update row ; 
     replace; 
    end; 
    else _error_ = 0; 
    run; 

IORC返回值的完整參考見SAS: How not to overwrite a dataset when the "where" condition in a "Modify" statement does not hold?

+0

謝謝vasja,我實際上正在考慮這個選項,問題是在交易表中有不同的名字... – user2518751

+1

因此,讓它們在交易表或相同的交易表中相同創建一個專門的視圖讓他們相同。 – vasja