You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求查询无员工部门的第三种SQL解决方案(已实现两种)

查询无员工部门的第三种SQL方案咨询

我已经完成课堂作业要求的两种查询无员工部门的SQL方案,现在想获取额外学分,想知道使用MINUS函数是否可行?以下是我的表结构和已实现的两种方案:

表结构创建语句

CREATE TABLE departments
(
    department_id, 
    department_name
) AS
SELECT 1, 'IT' FROM DUAL UNION ALL
SELECT 3, 'Sales' FROM DUAL UNION ALL
SELECT 2, 'DBA' FROM DUAL;


CREATE TABLE employees 
(
    employee_id, 
    first_name, last_name, 
    hire_date, 
    salary,  
    department_id
) AS
SELECT 1, 'Lisa', 'Saladino', DATE '2001-04-03', 100000, 1 FROM DUAL UNION ALL
SELECT 2, 'Abby', 'Abbott', DATE '2001-04-04', 50000, 1 FROM DUAL UNION ALL
SELECT 3, 'Beth', 'Cooper', DATE '2001-04-05', 60000, 1 FROM DUAL UNION ALL
SELECT 4, 'Carol', 'Orr', DATE '2001-04-06', 70000,1 FROM DUAL UNION ALL
SELECT 5, 'Vicky', 'Palazzo', DATE '2001-04-07', 88000,2 FROM DUAL UNION ALL
SELECT 6, 'Cheryl', 'Ford', DATE '2001-04-08', 110000,1 FROM DUAL UNION ALL
SELECT 7, 'Leslee', 'Altman', DATE '2001-04-10', 66666, 1 FROM DUAL UNION ALL
SELECT 8, 'Jill', 'Coralnick', DATE '2001-04-11', 190000, 2 FROM DUAL UNION ALL
SELECT 9, 'Faith', 'Aaron', DATE '2001-04-17', 122000,2 FROM DUAL;

已实现的两种有效方案

方案一:右连接+分组统计

select 
    d.department_id,
    d.department_name
from 
    employees e 
right join 
    departments d on e.department_id = d.department_id
group by 
    d.department_id, d.department_name
having 
    count(e.employee_id) = 0;

输出:

DEPARTMENT_ID    DEPARTMENT_NAME
--------------------------------
      3          Sales

方案二:NOT EXISTS子查询

SELECT 
    d.department_id,
    d.department_name 
FROM 
    departments d
WHERE
    NOT EXISTS (SELECT * FROM employees e 
                WHERE d.department_id = e.department_id)

输出:

DEPARTMENT_ID    DEPARTMENT_NAME
--------------------------------
      3          Sales

关于MINUS方案的可行性解答

完全可以使用MINUS来实现需求,MINUS会返回第一个查询结果中不存在于第二个查询结果的记录,刚好能筛选出没有对应员工记录的部门:

方案三:使用MINUS集合操作

SELECT department_id, department_name
FROM departments
MINUS
SELECT d.department_id, d.department_name
FROM departments d
JOIN employees e ON d.department_id = e.department_id;

或者更简洁的写法,直接从部门表中减去有员工关联的部门记录:

SELECT department_id, department_name
FROM departments
MINUS
SELECT DISTINCT e.department_id, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

两种写法都会返回正确结果:

DEPARTMENT_ID    DEPARTMENT_NAME
--------------------------------
      3          Sales

另外,还可以补充一种NOT IN方案作为额外选项:

方案四:NOT IN子查询

SELECT department_id, department_name
FROM departments
WHERE department_id NOT IN (
    SELECT DISTINCT department_id 
    FROM employees 
    WHERE department_id IS NOT NULL
);

注意要加上WHERE department_id IS NOT NULL,避免员工表中存在NULL部门ID导致NOT IN返回空结果。

内容的提问来源于stack exchange,提问作者Pugzly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:30:52