获取employee表中dept_id为NULL的记录,并将结果赋值给新添加的dept_id

问题描述 投票:0回答:2

MYSQL PROBLEM

我尝试过的查询:

SELECT 
    e.emp_id,
    e.emp_name,
    e.hire_date,
    e.job_name,
    e.dep_id,
    dpt_allotment.dpt_code AS 'New_Dept_id',
    dpt_allotment.dpt_name AS 'New_Dept_name'
FROM
    Employee e
        LEFT JOIN
    Department dpt_allotment ON e.dep_id = dpt_allotment.dpt_code
WHERE
    e.dep_id IS NULL 
UNION ALL SELECT 
    e.emp_id,
    e.emp_name,
    e.hire_date,
    e.job_name,
    e.dep_id,
    NULL AS 'New_Dept_id',
    NULL AS 'New_Dept_name'
FROM
    Employee e
WHERE
    e.dep_id IS NOT NULL
        AND e.dep_id NOT IN (SELECT 
            dpt_code
        FROM
            Department);

我的输出:

68454 TUCKER 9/8/1991 SALESMAN NULL NULL NULL     
68736 ADNRES 5/23/1997 CLERK NULL NULL NULL     
69000 JULIUS 12/3/1991 CLERK NULL NULL NULL     
69324 MARKER 1/23/1992 CLERK NULL NULL NULL     
63679 SANDRINE 12/18/1990 CLERK 21001 NULL NULL     
64989 ADELYN 2/20/1991 SALESMAN 21001 NULL NULL     
65271 WADE 2/22/1991 SALESMAN 21001 NULL NULL     
66564 MADDEN 9/28/1991 SALESMAN 21001 NULL NULL

预期输出:

68454 TUCKER 9/8/1991 SALESMAN NULL 22001 IT Internal2     
68736 ADNRES 5/23/1997 CLERK NULL 22001 IT Internal2     
69000 JULIUS 12/3/1991 CLERK NULL 22001 IT Internal2     
69324 MARKER 1/23/1992 CLERK NULL 22001 IT Internal2     
63679 SANDRINE 12/18/1990 CLERK 21001 NULL NULL     
64989 ADELYN 2/20/1991 SALESMAN 21001 NULL NULL     
65271 WADE 2/22/1991 SALESMAN 21001 NULL NULL     
66564 MADDEN 9/28/1991 SALESMAN 21001 NULL NULL
sql mysql mysql-workbench
2个回答
0
投票

基本上你需要第二个查询的相反操作。

新部门不在员工名单中,因为新部门尚未分配

SELECT 
    e.emp_id,
    e.emp_name,
    e.hire_date,
    e.job_name,
    e.dep_id,
    dpt_allotment.dpt_code AS 'New_Dept_id',
    dpt_allotment.dpt_name AS 'New_Dept_name'
FROM
    Employee e
        CROSS JOIN
    ( SELECT dpt_code,dpt_name  FROM Department WHERE dpt_code NOT IN (SELECT 
            dep_id
        FROM
            Employee)) dpt_allotment 
WHERE
    e.dep_id IS NULL 
UNION ALL SELECT 
    e.emp_id,
    e.emp_name,
    e.hire_date,
    e.job_name,
    e.dep_id,
    NULL AS 'New_Dept_id',
    NULL AS 'New_Dept_name'
FROM
    Employee e
WHERE
    e.dep_id IS NOT NULL
        AND e.dep_id NOT IN (SELECT 
            dpt_code
        FROM
            Department);

0
投票

第一个答案:

select
e.emp_id, e.emp_name, e.hire_date, e.job_name, e.dep_id, dpt_code as 'New Dept_id', dpt_name as 'New Dept_name' 
from employee e 
join (
SELECT dpt_code,dpt_name FROM department order by dpt_code desc limit 1
) d
where e.dep_id IS NULL
UNION
select
e.emp_id, e.emp_name, e.hire_date, e.job_name, e.dep_id, NULL as 'New Dept_id', NULL as 'New Dept_name'
from employee e 
where e.dep_id IS NOT NULL 
and e.dep_id NOT IN (SELECT dpt_code FROM department);

第二个答案:

select
e.emp_id, e.emp_name, e.hire_date, e.job_name, e.dep_id, dpt_code as 'New Dept_id', dpt_name as 'New Dept_name'
from department d, employee e
WHERE dpt_code NOT IN (SELECT dep_id FROM employee where dep_id IS NOT NULL)
and e.dep_id IS NULL
UNION ALL 
select
e.emp_id, e.emp_name, e.hire_date, e.job_name, e.dep_id, NULL as 'New Dept_id', NULL as 'New Dept_name'
from employee e 
where e.dep_id IS NOT NULL 
and e.dep_id NOT IN (SELECT dpt_code FROM department);
© www.soinside.com 2019 - 2024. All rights reserved.