关于部门表的查询

目录

笔者在工作中需要经常使用一个员工的部门id查询出这个部门的所有的上级部门信息的需求, 并且要求是按照 A/B/C/D/

表结构

员工表结构: emp-id ,emp-name,dept-id
由于部门机构最少有4级,而且以后还有可能会增加,
部门表: 这里写图片描述
部门id ,部门名字 ,部门等级,第一级部门id,直属上级部门id,
ps: 直属上级id为0 的说明他的直属上级就是 第一级部门

目的

我需要 能直接使用 员工信息表中的 直属部门id查询出这个部门的所有的上级部门的信息
所以建立视图,方便查询
如图视图的效果
这里写图片描述
那么怎么写这个 视图
采用硬编码的方式:

 SELECT 
            concat_ws('/'::text, t7.sub_company_name, t6.department_name, 
            t5.department_name, t4.department_name, t3.department_name, 
            t2.department_name, t1.department_name) AS department_name, 
    t1.emp_dept_info_id 
   FROM ((((((tbl_emp_department_info t1
     LEFT JOIN tbl_emp_department_info t2 ON ((t2.emp_dept_info_id = ((t1.supdep_code)::text)::integer)))
     LEFT JOIN tbl_emp_department_info t3 ON ((t3.emp_dept_info_id = ((t2.supdep_code)::text)::integer)))
     LEFT JOIN tbl_emp_department_info t4 ON ((t4.emp_dept_info_id = ((t3.supdep_code)::text)::integer)))
     LEFT JOIN tbl_emp_department_info t5 ON ((t5.emp_dept_info_id = ((t4.supdep_code)::text)::integer)))
     LEFT JOIN tbl_emp_department_info t6 ON ((t6.emp_dept_info_id = ((t5.supdep_code)::text)::integer)))
     LEFT JOIN tbl_emp_sub_company_info t7 ON ((t7.sub_company_id = ((t1.sub_company_id)::text)::integer)))
### 查询员工中不重复的部门名称或ID 为了从`employees`中提取唯一的部门名称或ID,可以使用SQL中的`DISTINCT`关键字。该关键字的作用是从查询结果集中去除重复项并仅保留唯一值。以下是具体的SQL查询语句: ```sql SELECT DISTINCT department FROM employees; ``` #### 解析 - `SELECT DISTINCT department`:这部分指定了只选择`department`字段,并且通过`DISTINCT`关键字确保返回的结果中不会包含任何重复的部门名称或ID[^1]。 - `FROM employees`:明确了数据源为`employees`。 这条简单的SQL语句能够有效地帮助我们获得一份列,其中包含了所有存在于`employees`中的独特部门名称或者ID。 --- ### 性能与优化建议 尽管`DISTINCT`是一个非常有用的工具,但它也可能带来一定的性能负担,尤其是在处理大规模数据集的时候。这是因为数据库引擎需要额外的时间来识别和移除重复条目[^2]。因此,在实际应用过程中,应当注意以下几点: - **索引的应用**:如果频繁地针对某个字段执行去重操作,则考虑为此字段建立索引,这样可以加快检索速度。 - **减少不必要的列**:尽量缩小涉及范围至最小必要限度内,即只需选取那些确实需要用到的列来进行distinct运算即可。 此外,假如除了单纯的部门名之外还需要关联其他信息比如每个部门至少有一位雇员的名字时,那么可以通过加入JOIN或者其他复杂逻辑达成目的。 --- ### 扩展功能 有时仅仅知道各部门的存在并不足够,可能还会关心诸如某特定条件下(例如活跃状态)下有效存在的单位有哪些等情况。这时就可以把条件筛选引入进来配合DISTINCT一起工作: ```sql SELECT DISTINCT department FROM employees WHERE status = 'active'; ``` 在此处添加了一个关于status等于'active'(示激活/在职等含义的状态标志位假设),从而限定最终输出仅为当前处于活动状况下的独立部门集合[^3]。 同样道理,还可以依据更多维度来做更加精细划分,像按地区分布来看待各个分支办事处之类的情形都是可行的思路方向之一。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值