Я пытаюсь обновить значения одной таблицы с обновленными значениями из второй таблицы. Однако, так как я обновить столбцы MODIFIED_BY и MODIFIED_ON первой таблицы, я только хочу, чтобы обновить строки, в которых есть обновленное значение:Коррелированное обновление с условиями
UPDATE SAFETY_ADMIN.SAFETY_USERS tbl1
SET (SUPERVISOR_ID,DEPT_ID,USER_ID,EMPLOYEE_TYPE,EMPLOYEE_NAME,EMAIL,MODIFIED_BY,MODIFIED_ON) =
(
SELECT SAFETY_ADMIN.FN_GETSUPERVISORID(tbl2.SUPID),CAST(tbl2.DEPTID AS NUMBER(19)),UPPER(SUBSTR(tbl2.EMAIL,1,INSTR(tbl2.EMAIL,'@')-1)),tbl2.EMPTYPE,tbl2.EMPNAME,tbl2.EMAIL,SYS_CONTEXT('USERENV', 'OS_USER'),CURRENT_TIMESTAMP
FROM PS_LOAD.EMPLOYEEDATA tbl2
WHERE tbl1.EMPLOYEE_ID = CAST(tbl2.EMPID AS NUMBER(19)) AND
(
tbl1.SUPERVISOR_ID <> SAFETY_ADMIN.FN_GETSUPERVISORID(tbl2.SUPID) OR
tbl1.DEPT_ID <> CAST(tbl2.DEPTID AS NUMBER(19)) OR
tbl1.USER_ID <> UPPER(SUBSTR(tbl2.EMAIL,1,INSTR(tbl2.EMAIL,'@')-1)) OR
tbl1.EMPLOYEE_TYPE <> tbl2.EMPTYPE OR
tbl1.EMPLOYEE_NAME <> tbl2.EMPNAME OR
tbl1.EMAIL <> tbl2.EMAIL
)
);
Однако мой запрос жалуется на обновление dept_id со значением NULL, даже несмотря на отсутствие нулевых значений. Я чувствую, что я устанавливаю условия ГДЕ в неправильном месте. Я больше парень SQL Server. Может кто-нибудь сказать мне, как это сделать в Oracle?
Это именно то, что я искал и работает так, как ожидалось! :) Слишком плохо PL/SQL так страшно. Этот запрос был бы вдвое меньше, чем в MS SQL Server. –
@David: здесь нет PL/SQL. Только SQL. – sstan
@DavidP не учитывает значения «NULL». Например, если 'EMAIL' был' NULL' в 'SAFETY_USERS' и имеет значение в' EMPLOYEEDATA', строка не будет обновляться. –