SQL Serverで使用するスクリプトがありますが、それを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;
これが私のやり方です。それは最高のパフォーマンスではないかもしれませんが、動作します。
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テーブルの情報を更新します。私はあなたのケースを信じて、あなたはそれを逆にしたいと思っています。したがって、スクリプトを実行する前に、必要な変更を行ってください。
新しいレコードを挿入する必要がある場合に備えて、上記のSQLに「WHEN NOT MATCHED THEN ....」句を追加できます(存在しない場合)。
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に設定されることに注意してください(または、上記の更新によりステートメントがnull以外の制約エラーで失敗する可能性があるため、これが場合によっては、これらを制限するためにupdateステートメントに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;