1. 数据库表
组织机构表 dept
id 部门id
dept_name 部门名称
dept_rank 部门层级
updept_id 上级部门id
def_flag 是否删除的标识
插入数据:
(1,苹果汽车公司,1,1,0)
(2,轮轴车间,2,1,0)
(3,班组一,3,2,0) [轮轴车间有个班组一]
(4,底盘车间,2,1,0)
(5,班组一,3,4,0) [底盘车间也有个班组一]
员工表 staff
id 员工id
staff_name 员工姓名
company_id 公司id
workshop_id 车间id
workteam_id 班组id
del_flag 是否删除的标识
插入数据:
(1,张三,1,2,3,0)
(2,李四,1,4,5,0)
可知,张三 是 苹果汽车公司轮轴车间班组一 的员工,李四是 苹果汽车公司底盘车间班组一的员工。
1.1 优点:
这种单表的层级结构设计,实现比较简单,健壮性高,即时以后层级增加,此表也能不做更改,继续使用。
1.2 缺点:
表内数据关联性过于强,一旦中间级别的组织被标记删除,其子组织都必须同步更新:被标记为删除。
2. 问题
输出员工id是2的员工的详细信息,格式如:
苹果汽车公司底盘车间班组一李四。
只用一条SQL。
通俗来说,就是把员工表里面的 公司id,车间id,班组id 转成各自的名称,即把 1,2,3转成 XXX公司,XXX车间,XXX班组。
3. SQL答案
select
(select dept_name from dept where dept_id =
(select company_id from staff sf where sf.id = 2)
) as company_name,
(select dept_name from dept where dept_id =
(select workshop_id from staff sf where sf.id = 2)
) as workshop_name,
(select dept_name from dept where dept_id =
(select workteam_id from staff sf where sf.id = 2)
) as workteam_name
4. 知识点
学习和使用了那么久的SQL语法,却感觉还是第一次这么用。自己的思路还是狭隘了,没有到打开。
这个SQL看着不完整,既没有 from table 子句,也没有 where 子句。但是确实可以使用。
实践证明:select 后面可以直接跟各种结果,而且 SQL不一定 需要 from table 和 where 子句等。
5. 拓展
拓展一下,这个方法还可以 单条SQL语句返回三个无关联的表的不同列的数据,几乎可以重新整合任何表的任何列数据到一个结果集中。