如何基于子查询返回的列值从另一表中查询记录
基于子查询结果关联另一张表的实现方案
首先先把你提到的子查询补全(根据你的示例数据,计算MONTHS用MySQL的TIMESTAMPDIFF会更准确):
SELECT `POST`, `START_DATE`, `END_DATE`, TIMESTAMPDIFF(MONTH, `START_DATE`, IFNULL(`END_DATE`, CURDATE())) AS MONTHS FROM your_job_history_table;
这个查询会生成你给出的示例结果集:
| POST | START_DATE | END_DATE | MONTHS |
|---|---|---|---|
| Senior Software Engg. | 2018-04-18 | NULL | (当前日期到2018-04-18的月数) |
| Software Engg. | 2017-04-18 | 2018-04-18 | 12 |
| Assoc. Software Engg. | 2016-04-18 | 2017-04-18 | 12 |
接下来,假设你要关联的另一张表叫employee_performance,里面有job_title、performance_score、review_date等字段,下面给你几种常用的筛选方式:
1. 通过JOIN关联匹配字段
如果你想匹配两张表中职位名称一致的记录,可以用INNER JOIN(只保留双向匹配的记录)或者LEFT JOIN(保留子查询的所有记录,关联表无匹配则显示NULL):
SELECT jh.`POST`, jh.`START_DATE`, ep.performance_score, ep.review_date FROM ( -- 你的子查询 SELECT `POST`, `START_DATE`, `END_DATE`, TIMESTAMPDIFF(MONTH, `START_DATE`, IFNULL(`END_DATE`, CURDATE())) AS MONTHS FROM your_job_history_table ) AS jh INNER JOIN employee_performance ep ON jh.`POST` = ep.job_title;
2. 通过IN子查询筛选特定列值
如果只需要筛选另一张表中职位出现在子查询结果里的记录,可以用IN子句,还能给子查询加额外过滤条件:
SELECT * FROM employee_performance WHERE job_title IN ( SELECT `POST` FROM your_job_history_table -- 比如只选任职时长超过10个月的职位 WHERE TIMESTAMPDIFF(MONTH, `START_DATE`, IFNULL(`END_DATE`, CURDATE())) > 10 );
3. 基于日期范围筛选
如果要找到某职位任职期间的关联记录(比如绩效评审),可以基于日期范围关联:
SELECT jh.`POST`, ep.performance_score, ep.review_date FROM ( SELECT `POST`, `START_DATE`, IFNULL(`END_DATE`, CURDATE()) AS END_DATE FROM your_job_history_table ) AS jh INNER JOIN employee_performance ep ON jh.`POST` = ep.job_title AND ep.review_date BETWEEN jh.START_DATE AND jh.END_DATE;
你可以根据实际的表结构和筛选需求调整JOIN条件或者WHERE子句就行。
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

