写一段多表联合查询的sql server语句,通过T_HR_ATS_PunchCardRecord表查询每个员工FID今年最近的一条打卡记录,删选出打卡日期FPunchCardTime字段超过查询日期30天的数据,再通过这些数据的FID字段在t_bd_person表查询出信息
时间: 2024-11-25 21:10:58 浏览: 18
DNV_ATS48_2012
你可以使用以下SQL Server语句来完成这个多表联合查询:
```sql
WITH CTE_LastPunchCard AS (
SELECT FID,
FPunchCardTime,
ROW_NUMBER() OVER (PARTITION BY FID ORDER BY FPunchCardTime DESC) AS RowNum
FROM T_HR_ATS_PunchCardRecord
WHERE YEAR(FPunchCardTime) = YEAR(GETDATE()) -- 获取当前年份
)
SELECT p.* -- 查询t_bd_person的所有列
FROM t_bd_person p
LEFT JOIN CTE_LastPunchCard l ON p.FID = l.FID AND l.RowNum = 1 -- 只取最近一次打卡记录
WHERE DATEDIFF(day, l.FPunchCardTime, GETDATE()) > 30 -- 检查是否超过30天
```
在这个查询中,我们首先创建了一个名为CTE_LastPunchCard的临时表(Common Table Expression),其中包含了每个员工今年最近的一次打卡记录。然后我们将`t_bd_person`表左连接到这个临时表上,只保留那些最近打卡日期超过30天的员工记录。
阅读全文