2016-11-17 4 views
0

取得エラー00933. 00000で複数の列に参加 - Aleksejコメントで示唆されているように"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

内部結合による更新文は、Oracleではサポートされません。 from節も。したがって、mergeを使用してください。 – Buddi

+2

この方法でUPDATEを使用することはできません。 [merge](http://docs.oracle.com/database/121/SQLRF/statements_9016.htm#SQLRF01606)をご覧ください。 – Aleksej

+0

@Buddi - これは真実ではありません。 Oracle **は内部結合を使用してUPDATEをサポートしています**正しく実行する必要があります。私は、なぜOracleがジョインでUPDATEをサポートしていないと思う人が非常に多いのか理解していません(そして、悪いことに、間違った知識を世界と共有することは大丈夫です)。それを繰り返さないでください。 – mathguy

答えて

0

アップデートのこの種を行うための最善の方法は、MERGE文です。 MERGEは、特にUPDATE、INSERT、DELETEに精通している方なら、本当に使い方が簡単で、非常に柔軟性があり、UPDATEよりも効率的です(実行中)。

また、正しいOracle構文に従うためにUPDATEをJOINで書き直すこともできます。 MERGEとUPDATE/JOINの両方とも、結合条件(MERGEの一致条件)が、ターゲット表の各行のソース表内の一意の行を識別していることを前提としています。これは限定的ではありませんが(一部はそう考えるかもしれませんが)、最初の意味での更新のための論理的な要件です。

UPDATEと結合は次のようになります。

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> 
; 

は、ソリューションを登録しようと、このUPDATEにMERGEソリューションの比較 - あなたはより明確MERGEがどのように感謝します!

+0

ありがとうございました:-) – Syan