SQL技术问询:关联多表获取员工工作电话信息(非硬编码)
查询员工工作电话信息的SQL方案
针对AdventureWorks2019数据库的需求,这里提供两种符合要求的实现方式,均满足不得硬编码PhoneNumberTypeID的要求:
方法一:多表连接(推荐,可读性更高)
通过INNER JOIN关联三张表,直接过滤所需条件:
SELECT p.FirstName, p.LastName, pp.PhoneNumber FROM Person.Person p INNER JOIN Person.PersonPhone pp ON p.BusinessEntityID = pp.BusinessEntityID INNER JOIN Person.PhoneNumberType pnt ON pp.PhoneNumberTypeID = pnt.PhoneNumberTypeID WHERE p.PersonType = 'Employee' AND pnt.Name = 'Work';
说明:
- 利用
BusinessEntityID关联人员表和人员电话表,确保获取对应人员的电话数据 - 通过
PhoneNumberTypeID关联电话表和电话类型表,用pnt.Name = 'Work'替代硬编码ID,符合需求 - INNER JOIN会自动过滤掉没有匹配电话或电话类型的记录,只返回符合所有条件的结果
方法二:子查询方式
如果偏好子查询写法,可以先获取"Work"类型对应的ID,再关联查询:
SELECT p.FirstName, p.LastName, pp.PhoneNumber FROM Person.Person p INNER JOIN Person.PersonPhone pp ON p.BusinessEntityID = pp.BusinessEntityID WHERE p.PersonType = 'Employee' AND pp.PhoneNumberTypeID = ( SELECT PhoneNumberTypeID FROM Person.PhoneNumberType WHERE Name = 'Work' );
说明:
- 子查询
(SELECT PhoneNumberTypeID FROM Person.PhoneNumberType WHERE Name = 'Work')动态获取工作电话的类型ID,避免硬编码 - 同样通过
BusinessEntityID关联人员和电话表,过滤出员工的工作电话
内容的提问来源于stack exchange,提问作者Felicia
相关产品推荐
相关产品推荐

