2016-11-17 79 views
0

收到錯誤00933. 00000 - "SQL command not properly ended"如何使用內部連接了多列更新的Oracle

UPDATE users SET     
      username  = a.username,     
      groupcode = a.groupcode,    
      adauth  = a.adauth,    
      userlevel = a.userlevel,     
      locationcd = a.locationcd,    
      panno  = a.panno,     
      authrej  = a.authrej,     
      multilogin = a.multilogin,     
      loginstatus = a.loginstatus,     
      userstatus = a.userstatus,     
      lupdnuser = a.lupdnuser,     
      lupdndt  = a.lupdndt,     
      createdby = p_cUserId ,     
      createddt = SYSTIMESTAMP,     
      closedby  = a.closedby ,     
      closeddt  = a.closeddt ,     
      emailid  = a.emailid ,  
      passwordattempt = CASE cast (a.userstatus as varchar) WHEN '01' THEN 0 ELSE a.passwordattempt END      
      FROM userstrans a      
      INNER JOIN users b ON      
      a.userid = b.userid   
      AND a.sysuserno = b.sysuserno       
      WHERE a.systrnno  = p_nSysTrnNo     
      AND a.trnmode  = 'EDIT'     
     AND a.trnid  = 'N'; 
+3

帶有內連接的Update語句在oracle中不支持。即使從條款也。所以使用合併。 – Buddi

+2

你不能這樣使用UPDATE;看看[合併](http://docs.oracle.com/database/121/SQLRF/statements_9016.htm#SQLRF01606) – Aleksej

+0

@Buddi - 這是不正確的。 Oracle **不支持使用內部連接的UPDATE - 它只需要正確地完成。我不明白爲什麼有這麼多人認爲Oracle不支持聯合更新(更糟糕的是,覺得可以與世界分享他們的錯誤知識)。請不要重複這一點。 – mathguy

回答

0

最好的方式做這樣的更新與MERGE語句,Aleksej在註釋建議。 MERGE非常易於學習和使用(特別是如果您已經熟悉UPDATE,INSERT和DELETE),它非常靈活,並且有時比UPDATE更有效(執行時)。

或者,您可以使用JOIN重寫您的UPDATE以遵守正確的Oracle語法。 MERGE和UPDATE/JOIN都假定連接條件(MERGE的匹配條件)在源表中爲目標表中的每一行標識一個唯一行;這不是一個限制(正如一些人可能認爲的那樣),而是更新的合理要求,首先是有意義的。

與JOIN更新應該是這樣的:

update 
    (select b.username as b_username , a.username as a_username , 
      b.groupcode as b_groupcode, a.groupcode as a_groupcode, 
      ETC. 
    from users b inner join userstrans a on b.userid = a.userid 
              and b.sysuserno = a.sysuserno) 
set b_username = a_username, ETC. 
where <WHERE conditions here> 
; 

比較MERGE解決這個更新與JOIN的解決方案 - 你會明白MERGE多少清晰的是!

+0

謝謝mathguy :-) – Syan