• 【力扣白嫖日记】SQL


    前言

    练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。

    今日题目:

    1789.员工的直属部门
    表:Employee

    列名类型
    employee_idint
    department_idint
    primary_flagvarchar

    这张表的主键为 employee_id, department_id (具有唯一值的列的组合)
    employee_id 是员工的ID
    department_id 是部门的ID,表示员工与该部门有关系
    primary_flag 是一个枚举类型,值分别为(‘Y’, ‘N’). 如果值为’Y’,表示该部门是员工的直属部门。 如果值是’N’,则否。
    一个员工可以属于多个部门。当一个员工加入超过一个部门的时候,他需要决定哪个部门是他的直属部门。请注意,当员工只加入一个部门的时候,那这个部门将默认为他的直属部门,虽然表记录的值为’N’.
    请编写解决方案,查出员工所属的直属部门。
    返回结果 没有顺序要求 。


    我那不值一提的想法:

    • 首先梳理表内容,题干一共给了一张员工表,记录了员工id,部门id,以及该员工的直属部门。
    • 其次分析需求,需要找到员工直属部门,但是一个员工可能参加了多个部门,如何判哪个是直属部门呢,primary_flag的条件必须是"Y"就是直属部门,但是如果只有一个部门的话,就算是"N"都是直属部门
    • 在这个地方我就想当然以为,只有一个部门的话那肯定就是“N”,所以导致我后面的思路都错了,我的思路就是首先利用部门的数量匹配N或Y,如果部门数量大于一就是Y,等于一就是N,但是我没想到,题目中的案例有等于也是Y的例子。写这么久,感觉逻辑挺清楚的,结果错了,崩了。
      在这里插入图片描述
      我希望建立一个临时表,将部门数量大于1的设为Y,等于1的设为N,原表再右连接这个临时表,连接条件是primary_flagemployee_id相同。然后搜索员工id和部门id。
      我的错误代码:
    select e.employee_id,e.department_id
    from Employee e 
    right join 
        (select employee_id,
        case 
        when count(employee_id) = 1 then "N"
        when count(employee_id) > 1 then "Y"
        end as primary_flag
        from Employee   
        group by employee_id
        ) as a 
    on e.primary_flag = a.primary_flag and e.employee_id = a.employee_id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    最后看了题解,发现最简单的方法是利用union函数,以前从来没用过,union函数可以用于连接多个结果。union要求连接的两个结果列数和数据类型必须匹配,刚好这道题可以通过union将两种结果连接起来,第一种也就是直接count(*) = 1,第二种是primary_flag=“Y”。

    select employee_id,department_id
    from Employee
    group by employee_id 
    having count(*) = 1
    union
    select employee_id,department_id
    from Employee
    where primary_flag = "Y"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果:

    在这里插入图片描述


    总结:

    能运行就行。


  • 相关阅读:
    计算机网路学习-time_wait过多
    Java项目(三)-- SSM开发社交网站(7)--会员注册与登录
    c++23中的新功能之七三个新的扩展
    安达发APS|APS智能排程软件的核心优势
    读取一张图片各种颜色占比
    ES6 新特性重点部分
    山海鲸可视化B/S架构应用
    【面试题】如何去掉vue的url地址中的#号?及其原理?
    企企通:数字化浪潮下,企业如何利用间接采购策略,实现降本增效?
    关于vue2项目使用sacc
  • 原文地址:https://blog.csdn.net/dkmaa/article/details/136137118