2013-05-08 4 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_TMP, используя данные таблицы PERSONS. Я верю в ваше дело, вы хотите, чтобы все было наоборот. Поэтому перед запуском скрипта обязательно сделайте необходимые изменения.

Вы можете добавить предложение «КОГДА НЕ СМ. ТОГДА ....» к вышеуказанному SQL, если вам нужно вставить новые записи, если он не существует.

+0

Я добавил, что (я думаю), говорится в статье, чтобы сделать выше. Тем не менее не работает для меня, к сожалению. – PhelpsK

+0

Извините за беспорядок со ссылкой на сайт Тома. Я попробовал сценарий с сайта Тома, и он тоже не работал. Итак, я удалил ссылку на его сайт. – donny

+0

Это сработало спасибо! – PhelpsK

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, эти дополнительные строки в таблице лиц будут установлены в нуль (или могут привести заявление к неудаче с не нулевой ошибкой ограничения по обновите выше, поэтому, если это так, вам также может понадобиться предложение where в инструкции обновления, чтобы ограничить их, например, если я знаю, что поле mail_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; 
Смежные вопросы