2013-05-08 33 views
8

我有一个脚本,我在SQL Server中使用但我需要将其转换为Oracle格式。谁能帮忙?从另一个表更新多列 - 需要Oracle格式

UPDATE PERSONS P SET 
     P.JOBTITLE=TE.JOBTITLE, 
     P.LAST_NAME=TE.LAST_NAME, 
     P.FIRST_NAME=TE.FIRST_NAME, 
     P.DBLOGIN_ID=TE.DBLOGIN_ID, 
     P.EMAIL_ID=TE.EMAIL_ID, 
     P.USERLEVEL=TE.USERLEVEL, 
     P.FACILITY_ID=TE.FACILITY_ID, 
     P.SUPERVISOR=TE.SUPERVISOR, 
     P.DEPARTMENT=TE.DEPARTMENT, 
     P.WINLOGINID=TE.WINLOGINID 
    FROM TEMP_ECOLAB_PERSONS TE 
    WHERE P.PERSON=TE.PERSON; 

- 从下面的文章中,我想出了以下声明。它仍然不幸运:

UPDATE (SELECT P.JOBTITLE, P.LAST_NAME, P.FIRST_NAME, P.DBLOGIN_ID, P.EMAIL_ID, 
     P.USERLEVEL, P.FACILITY_ID, P.SUPERVISOR, P.DEPARTMENT, 
     TE.JOBTITLE, TE.LAST_NAME, TE.FIRST_NAME, TE.DBLOGIN_ID, TE.EMAIL_ID, 
     TE.USERLEVEL, TE.FACILITY_ID, TE.SUPERVISOR, TE.DEPARTMENT 
    FROM PERSONS P, TEMP_ECOLAB_PERSONS TE WHERE P.PERSON=TE.PERSON) 
    SET 
    P.JOBTITLE=TE.JOBTITLE, 
    P.LAST_NAME=TE.LAST_NAME, 
    P.FIRST_NAME=TE.FIRST_NAME, 
    P.DBLOGIN_ID=TE.DBLOGIN_ID, 
    P.EMAIL_ID=TE.EMAIL_ID, 
    P.USERLEVEL=TE.USERLEVEL, 
    P.FACILITY_ID=TE.FACILITY_ID, 
    P.SUPERVISOR=TE.SUPERVISOR, 
    P.DEPARTMENT=TE.DEPARTMENT; 

回答

8

这是我该怎么做。它可能不是最好的性能,但它的工作原理。

MERGE INTO PERSONS_TMP PT 
USING ( 
    SELECT P.PERSON, P.JOB_TITLE, P.FIRST_NAME, P.LAST_NAME, P.FACILITY_ID 
    FROM PERSONS P) TMP 
ON (PT.PERSON = TMP.PERSON) 
WHEN MATCHED THEN 
UPDATE SET 
    PT.FACILITY_ID = TMP.FACILITY_ID, 
    PT.JOB_TITLE = TMP.JOB_TITLE, 
    PT.FIRST_NAME = TMP.FIRST_NAME, 
    PT.LAST_NAME = TMP.LAST_NAME; 

上面的脚本将使用来自PERSONS表的数据更新PERSONS_TMP表中的信息。我相信你的情况,你想以相反的方式。所以,请确保在运行脚本之前进行必要的更改。

如果您需要插入新记录(如果不存在),则可以将“WHEN NOT MATCHED THEN ....”子句添加到上述SQL中。

+0

我补充了什么(我认为)文章上面说过要做。仍然不适合我。 – PhelpsK 2013-05-08 14:53:38

+0

对不起,汤姆的网站链接混淆。我尝试了Tom的网站上的脚本,但它也没有工作。所以,我删除了他的网站的链接。 – donny 2013-05-08 23:00:21

+0

它的工作谢谢你! – PhelpsK 2013-05-10 18:41:04

12
UPDATE PERSONS P 
    SET (jobtitle, 
     last_name, 
     first_name, 
     dblogin_id, 
     email_Id, 
     userlevel, 
     facility_id, 
     supervisor, 
     department, 
     winloginid) = (select jobtitle, 
           last_name, 
           first_name, 
           dblogin_id, 
           email_Id, 
           userlevel, 
           facility_id, 
           supervisor, 
           department, 
           winloginid 
         from TEMP_ECOLAB_PERSONS TE 
         where TE.PERSON=P.PERSON); 

需要注意的是,如果有出现在人不在temp_ecolab_persons其他行,在人表中的这些额外的行会被设置为null(或可能导致语句失败与NOT NULL约束错误更新上面所以如果是这样的话,你可能还需要更新语句中的where子句来限制这些,例如,如果我知道email_id字段填充在某些记录上而不是其他人上,我可以将更新限制在这些行上如下

UPDATE PERSONS P 
    SET (jobtitle, 
     last_name, 
     first_name, 
     dblogin_id, 
     email_Id, 
     userlevel, 
     facility_id, 
     supervisor, 
     department, 
     winloginid) = (select jobtitle, 
          last_name, 
          first_name, 
          dblogin_id, 
          email_Id, 
          userlevel, 
          facility_id, 
          supervisor, 
          department, 
          winloginid 
         from TEMP_ECOLAB_PERSONS TE 
         where TE.PERSON=P.PERSON) 
    WHERE email_id is null; 
相关问题