关于查询至少存在于一个考勤表的员工跨表出勤状态的技术需求
考勤表状态汇总解决方案
嘿,这个考勤汇总的需求很好解决,用SQL就能轻松实现!下面给你两种靠谱的方案,都能生成你想要的结果——展示所有至少在一张表中存在的员工,同时标记他们在各表的出勤状态(Y=有记录,N=无记录):
方法一:先收集所有员工编码再左连接(通用所有SQL数据库)
这种方法兼容性最好,不管你用MySQL、SQL Server还是PostgreSQL都能跑通:
WITH AllEmployees AS ( SELECT `Employee Code` FROM table1 UNION SELECT `Employee Code` FROM table2 UNION SELECT `Employee Code` FROM table3 ) SELECT ae.`Employee Code`, CASE WHEN t1.`Employee Code` IS NOT NULL THEN 'Y' ELSE 'N' END AS `Table 1`, CASE WHEN t2.`Employee Code` IS NOT NULL THEN 'Y' ELSE 'N' END AS `Table 2`, CASE WHEN t3.`Employee Code` IS NOT NULL THEN 'Y' ELSE 'N' END AS `Table 3` FROM AllEmployees ae LEFT JOIN table1 t1 ON ae.`Employee Code` = t1.`Employee Code` LEFT JOIN table2 t2 ON ae.`Employee Code` = t2.`Employee Code` LEFT JOIN table3 t3 ON ae.`Employee Code` = t3.`Employee Code` ORDER BY ae.`Employee Code`;
逻辑说明:
- 用
WITH子句创建临时表AllEmployees,通过UNION从三个考勤表中收集所有唯一的员工编码(UNION会自动去重,刚好满足“仅展示至少存在于一张表中的员工”的要求); - 分别左连接三个考勤表,通过
CASE语句判断该员工在对应表是否有记录,有就返回Y,没有返回N; - 最后按员工编码排序,让结果更规整。
方法二:使用全连接(适合支持FULL JOIN的数据库)
如果你的数据库支持FULL JOIN(比如SQL Server、PostgreSQL),可以用这种更简洁的写法:
SELECT COALESCE(t1.`Employee Code`, t2.`Employee Code`, t3.`Employee Code`) AS `Employee Code`, CASE WHEN t1.`Employee Code` IS NOT NULL THEN 'Y' ELSE 'N' END AS `Table 1`, CASE WHEN t2.`Employee Code` IS NOT NULL THEN 'Y' ELSE 'N' END AS `Table 2`, CASE WHEN t3.`Employee Code` IS NOT NULL THEN 'Y' ELSE 'N' END AS `Table 3` FROM table1 t1 FULL JOIN table2 t2 ON t1.`Employee Code` = t2.`Employee Code` FULL JOIN table3 t3 ON COALESCE(t1.`Employee Code`, t2.`Employee Code`) = t3.`Employee Code` ORDER BY COALESCE(t1.`Employee Code`, t2.`Employee Code`, t3.`Employee Code`);
逻辑说明:
FULL JOIN会保留所有参与连接的表中的记录,不管是否匹配;- 用
COALESCE函数从三个表的员工编码中取第一个非空值,得到每个员工的唯一编码; - 同样用
CASE语句判断各表的存在状态,最后排序输出。
最终输出结果
两种方法都能生成你需要的汇总表:
| Employee Code | Table 1 | Table 2 | Table 3 |
|---|---|---|---|
| 1001 | Y | Y | N |
| 1002 | N | Y | N |
| 1003 | Y | N | Y |
内容的提问来源于stack exchange,提问作者SURYA
相关产品推荐
相关产品推荐

