我有一个表,该表的列为EMPID,SAL,EMP_NAME,MANAGER_ID,MANAGER_NAME,并且经理名称为null。因此,我需要通过比较empid和manager_id并获取emp_name来更新经理名称。
我创建了一个临时表并编写了合并操作以更新记录。 没有创建临时表,我们能做些什么吗??
答案 0 :(得分:0)
数据创建:
CREATE TABLE EMPS (
EMPID NUMBER,
SAL NUMBER(10, 2),
EMP_NAME VARCHAR2(100),
MANAGER_ID NUMBER,
MANAGER_NAME VARCHAR2(100)
);
INSERT INTO EMPS VALUES (1,1000,'EMP1',3,NULL);
INSERT INTO EMPS VALUES (2,2000,'EMP2',3,NULL);
INSERT INTO EMPS VALUES (3,3000,'MGR1',NULL,NULL);
INSERT INTO EMPS VALUES (4,4000,'EMP3',6,NULL);
INSERT INTO EMPS VALUES (5,5000,'EMP4',6,NULL);
INSERT INTO EMPS VALUES (6,6000,'MGR2',NULL,NULL);
SELECT * FROM EMPS;
-- Query to update the data -- Alternative 1
UPDATE EMPS EE
SET
EE.MANAGER_NAME = (
SELECT
EM.EMP_NAME
FROM
EMPS EM
WHERE
EM.EMPID = EE.MANAGER_ID
);
-- Query to update the data -- Alternative 2
MERGE INTO EMPS EE
USING
(
SELECT
EEMP.EMPID,
EMGR.EMP_NAME
FROM
EMPS EEMP,
EMPS EMGR
WHERE
EEMP.MANAGER_ID = EMGR.EMPID
)
EEEM ON ( EE.EMPID = EEEM.EMPID )
WHEN MATCHED THEN
UPDATE SET EE.MANAGER_NAME = EEEM.EMP_NAME;
SELECT * FROM EMPS;
这是一个非常简单的更新。
但是,是的,上述解决方案(替代方案1)将对表的每一行执行一个“ select”语句。
答案 1 :(得分:0)
您也可以尝试此操作。
这在以下情况下可行:
update emp t3
set mgr_name = (select qry.mgr_name
from (select empno, mgr, CONNECT_BY_ROOT ENAME mgr_name
from emp t2
WHERE LEVEL = 2
connect by nocycle prior t2.empno = t2.mgr) qry
where qry.empno = t3.empno
and qry.mgr = t3.mgr)
where (t3.empno, t3.mgr) IN (select t1.empno, t1.mgr
from emp t1
WHERE LEVEL = 2
connect by nocycle prior t1.empno = t1.mgr);