Oracle学习笔记(多表查询)

业务中关于数据筛选需要使用特定的SQL,比如,如何关联不同表空间下的数张表,结合聚合函数进行查询、分类、排序、筛选?

案例一:关联人员表、部门表,查询人员归属信息,并根据部门进行分组,根据部门顺序进行排序显示

结果:
在这里插入图片描述

如图所示,人员按照所属部门进行聚合、排序。

select * from (

select h.user_id,h.login_name,h.user_name,d.deptname,d.deptcode ,d.show_indx

from his_users h

left join dept_dict d 

on h.dept_code = d.deptcode

and d.deptname in('心内科一病区','心内科二病区','呼吸内科','消化内科一病区')

-- where rownum >=1 and rownum <=500

group by h.user_id,h.login_name,h.user_name,d.deptname,d.deptcode,d.show_indx


order by d.show_indx asc

) 
where rownum <=300

Tips: group by 要写在order by 之前,且select后的列需要出现在聚合函数中或group by条件中

案例二:A表空间下表1有2500人,B表空间下表2有900人,找出表2不存在于表1中的人,人员ID为主键。

在这里插入图片描述
结果:
在这里插入图片描述

-- 结果集1 minus (结果集 2(小) intersect 结果集 3(大))
-- sys_users 某一部门 结果集 1
(
select u.staff_id user_id,u.user_name,d.dept_name deptname,d.dept_code deptcode

from kyeesys.sys_users u 

left join kyeesys.sys_dept d 

on u.ward_code = d.dept_code 

group by u.staff_id,u.user_name,d.dept_name,d.dept_code

having dept_code =1011100
)
minus

(
-- sys_users 某一部门 结果集 2(小结果集)
select * from(

select u.staff_id user_id,u.user_name,d.dept_name deptname,d.dept_code deptcode

from kyeesys.sys_users u 

left join kyeesys.sys_dept d 

on u.ward_code = d.dept_code 

group by u.staff_id,u.user_name,d.dept_name,d.dept_code

having dept_code =1011100
)
intersect
-- his_users 某一部门 结果集 3(大结果集)
(
select h.user_id,h.user_name,d.deptname,d.deptcode

from his_users h

left join dept_dict d 

on h.dept_code = d.deptcode

and d.deptname in('神经内科一病区')

group by h.user_id,h.user_name,d.deptname,d.deptcode

having deptcode=1011100

)
)

Tips: 使用了minus(差),intersect(交集),having在group by筛选后使用,where在group by之前使用

持续更新……2019年11月15日 11:13:24

发布了135 篇原创文章 · 获赞 98 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_35206244/article/details/103039037