根据emp_name,manager_id和emp_id更新manager_name

时间:2019-06-05 03:58:37

标签: sql oracle

我有一个表,该表的列为EMPID,SAL,EMP_NAME,MANAGER_ID,MANAGER_NAME,并且经理名称为null。因此,我需要通过比较empid和manager_id并获取emp_name来更新经理名称。

我创建了一个临时表并编写了合并操作以更新记录。 没有创建临时表,我们能做些什么吗??

Screenshot of records

enter image description here

2 个答案:

答案 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;

Before update

-- 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;

After Update

这是一个非常简单的更新。

但是,是的,上述解决方案(替代方案1)将对表的每一行执行一个“ select”语句。

答案 1 :(得分:0)

您也可以尝试此操作。

这在以下情况下可行:

  1. 如果一位经理的报告人不止一个。
  2. 当一位经理只有一个报告人时。
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);