SQL中如何使用自连接替代子查询实现同门店员工查询
问题描述
需求为检索与员工George在同一零售门店工作的员工姓名、职位、邮箱ID,查询结果需排除George本人的记录。
你当前使用嵌套子查询的实现代码如下:
SELECT empname, designation, emailid FROM Empdetails WHERE Worksin = ( SELECT Worksin FROM Empdetails where empname = 'George' ) AND empname <> 'George'
SELF JOIN(自连接)实现方式
自连接的核心是将同一张表赋予不同别名,当作两张独立的表做关联查询,这里我们可以用一个别名定位George的门店信息,另一个别名筛选符合条件的员工记录,代码如下:
SELECT e2.empname, e2.designation, e2.emailid FROM Empdetails e1 JOIN Empdetails e2 ON e1.Worksin = e2.Worksin WHERE e1.empname = 'George' AND e2.empname <> 'George';
逻辑说明
- 表别名
e1用来定位George的基准数据,e2用来返回最终需要的同门店员工数据 - 关联条件
e1.Worksin = e2.Worksin保证两张逻辑表匹配到的是同一门店的员工 - WHERE子句中
e1.empname = 'George'先锁定George对应的门店,e2.empname <> 'George'直接排除George本人的记录
补充说明:如果表中存在多个同名George的员工,原子查询写法里的
=会触发子查询返回多行报错,需要替换为IN;自连接写法天然兼容这种重名场景,不需要额外调整。两种写法在主流数据库中经过优化器处理后,执行效率基本没有差异。
内容的提问来源于stack exchange,提问作者B_HOP
相关产品推荐
相关产品推荐

