SQL嵌套子查询问题:查询ID为105的员工工作地点完整信息
问题解决:获取ID为105的员工工作地点完整数据
需求说明
使用HR.LOCATIONS、HR.DEPARTMENTS和HR.EMPLOYEES三张表,展示员工ID为105的员工工作地点的完整数据。
错误SQL语句
原执行失败的SQL:
select street_address from hr.locations where street_address in (select location_id from hr.departments where(select department_id from hr.employees where employee_id = "105"))
错误原因
- 字段匹配逻辑错误:用
street_address(地址字符串)和子查询返回的location_id(数字类型地点ID)做匹配,两者类型、含义完全不对应,导致关联失效。 - 子查询语法缺失:中间
WHERE后直接嵌套子查询,未指定关联条件,正确写法应为department_id = (子查询)。 - 数据类型不匹配:
employee_id是数字类型,不应使用双引号包裹"105",直接写数字或用单引号即可。
正确SQL写法
方法一:JOIN关联表(推荐,逻辑清晰性能更优)
SELECT l.* FROM hr.locations l JOIN hr.departments d ON l.location_id = d.location_id JOIN hr.employees e ON d.department_id = e.department_id WHERE e.employee_id = 105;
通过表间外键关联(员工表department_id关联部门表department_id,部门表location_id关联地点表location_id),直接定位目标员工对应的完整地点数据。
方法二:修正嵌套子查询
SELECT l.* FROM hr.locations l WHERE l.location_id = ( SELECT d.location_id FROM hr.departments d WHERE d.department_id = ( SELECT e.department_id FROM hr.employees e WHERE e.employee_id = 105 ) );
修正字段匹配逻辑,用location_id关联部门表与地点表,同时通过等值匹配确保子查询返回正确的关联字段。
表结构参考
hr.employees表
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | PHONE_NUMBER | HIRE_DATE | JOB_ID | SALARY | COMMISSION_PCT | MANAGER_ID | DEPARTMENT_ID | |
|---|---|---|---|---|---|---|---|---|---|---|
| 100 | Steven | King | SKING | 515.123.4567 | 17-JUN-03 | AD_PRES | 24000 | - | - | 90 |
hr.departments表
| DEPARTMENT_ID | DEPARTMENT_NAME | MANAGER_ID | LOCATION_ID |
|---|---|---|---|
| 10 | Administration | 200 | 1700 |
hr.locations表
| LOCATION_ID | STREET_ADDRESS | POSTAL_CODE | CITY | STATE_PROVINCE | COUNTRY_ID |
|---|---|---|---|---|---|
| 1000 | 1297 Via Cola di Rie | 00989 | Roma | - | IT |
内容的提问来源于stack exchange,提问作者Rume Diablo
相关产品推荐
相关产品推荐

