В Oracle каноническим способом сделать это является выражение MERGE
:
MERGE INTO emp e
USING dept d
ON (d.empno = e.empno)
WHEN MATCHED THEN UPDATE SET e.deptno = d.deptno
Однако вышеприведенное не будет работать, если вы используете Oracle 9 (см. Ниже) или если есть домениндекс в ваших таблицах (например, Oracle Text)
Я задал вопрос ранее о том, что делают операторы MERGE.
Необходимо, чтобы каждая строка e
быласоединен условием соединения (секция ON
) с нулевой или ровно 1 строкой d
, в противном случае вы получите ORA-30926 «Невозможно получить стабильный набор строк в исходных таблицах».
Строки e
, не связанные с каким-либо отделом, остаются без изменений, строки d
, не связанные с каким-либо сотрудником, могут использоваться для INSERTS
(а в Oracle 9 необходимо использовать в WHEN NOT MATCHED THEN INSERT(cols) VALUES(...)
пункт; если вы используете Oracle 9, тогда этот ответ вам не подходит).
Другой вариант, но с учетом тех же основных ограничений:
UPDATE (SELECT e.deptno edeptno, d.deptno ddeptno
FROM emp e, dept d
WHERE e.empno = d.empno)
SET edeptno = ddeptno
или
UPDATE emp
SET deptno = ( SELECT deptno FROM dept WHERE empno = emp.empno )
WHERE empno IN ( SELECT empno FROM dept )
Как видите, решений много, но они могут бытьraints.