考勤系统SQL查询需求:关联TIMEIN与TIMEOUT表并补全NULL值
嘿,这个需求用**全外连接(FULL OUTER JOIN)**就能完美解决,它会保留两张表的所有记录,当某一边的索引在另一边找不到匹配时,对应字段就会自动显示NULL。下面给你具体的实现步骤:
1. 测试表结构与数据示例
先明确我们的表结构和测试数据(如果和你的实际表结构有出入,调整字段名即可):
-- 创建上班打卡表 TIMEIN CREATE TABLE TIMEIN ( IINDX INT PRIMARY KEY, EMP_NAME VARCHAR(50), IN_TIME DATETIME ); -- 创建下班打卡表 TIMEOUT CREATE TABLE TIMEOUT ( OINDX INT PRIMARY KEY, EMP_NAME VARCHAR(50), OUT_TIME DATETIME ); -- 插入测试数据 INSERT INTO TIMEIN VALUES (1, '张三', '2024-05-20 08:30:00'), (2, '李四', '2024-05-20 08:25:00'), (3, '王五', '2024-05-20 08:40:00'); INSERT INTO TIMEOUT VALUES (1, '张三', '2024-05-20 18:00:00'), (3, '王五', '2024-05-20 18:10:00'), (4, '赵六', '2024-05-20 18:05:00');
2. 核心查询语句
使用FULL OUTER JOIN关联两张表,关联条件为上班打卡的IINDX与下班打卡的OINDX一致:
SELECT t1.IINDX, t1.EMP_NAME AS IN_EMP_NAME, t1.IN_TIME, t2.OINDX, t2.EMP_NAME AS OUT_EMP_NAME, t2.OUT_TIME FROM TIMEIN t1 FULL OUTER JOIN TIMEOUT t2 ON t1.IINDX = t2.OINDX;
3. 结果说明
- 李四(
IINDX=2)仅有上班打卡记录,无对应下班打卡(OINDX=2不存在于TIMEOUT表),因此TIMEOUT相关字段(OINDX、OUT_EMP_NAME、OUT_TIME)会显示为NULL。 - 赵六(
OINDX=4)仅有下班打卡记录,无对应上班打卡(IINDX=4不存在于TIMEIN表),因此TIMEIN相关字段(IINDX、IN_EMP_NAME、IN_TIME)会显示为NULL。 - 张三和王五的上下打卡记录能匹配,所有字段均有正常值。
这样就完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Hussain Zagzoug
相关产品推荐
相关产品推荐

