2013-05-08 9 views
8

Mam skrypt, którego używam w SQL Server, ale muszę go przekonwertować do formatu Oracle. Czy ktoś może pomóc?Aktualizowanie wielu kolumn z innej tabeli - Potrzebujesz formatu 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; 

--from artykuł poniżej wpadłem z następującym stwierdzeniem. Nadal nie działa niestety:

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; 

Odpowiedz

8

Tak to zrobię. To może nie być najlepsza wydajność, ale działa.

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; 

Powyższy skrypt zaktualizuje informacje w tabeli PERSONS_TMP przy użyciu danych z tabeli PERSONS. Wierzę w twoją sprawę, chcesz to zrobić na odwrót. Dlatego przed uruchomieniem skryptu upewnij się, że wprowadziłeś niezbędne zmiany.

Możesz dodać klauzulę "WHEN NOT MATCHED THEN ..." do powyższego kodu SQL, jeśli chcesz wstawić nowe rekordy, jeśli nie istnieje.

+0

dodałem co (chyba) artykuł mówi się zrobić powyżej. Nadal nie działa dla mnie niestety. – PhelpsK

+0

Przepraszamy za zamieszanie z linkiem do strony Toma. Próbowałem skryptu ze strony internetowej Toma i to też nie działało. Dlatego usunąłem link do jego strony internetowej. – donny

+0

To zadziałało, dziękuję! – 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); 

Zauważ, że jeśli istnieją inne wiersze występujące u osób, które nie są w temp_ecolab_persons, te dodatkowe wiersze w tabeli osoba zostanie ustawiona na null (lub może spowodować, że oświadczenie nie z not null błędu więzów przez zaktualizuj powyższe, więc jeśli tak jest, możesz potrzebować również klauzuli where instrukcji update, aby je ograniczyć, np. jeśli wiem, że pole email_id jest zapełnione w niektórych rekordach, ale nie w innych, mogę ograniczyć aktualizację tylko do tych wierszy następująco

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; 
Powiązane problemy