写一段多表联合查询的sql语句,通过T_HR_ATS_PunchCardRecord表查询每个员工FID今年最近的一条打卡记录,删选出打卡日期FPunchCardTime字段超过查询日期30天的数据,再通过这些数据的FID字段在t_bd_person表查询出信息
时间: 2024-11-25 12:11:14 浏览: 55
你可以使用以下SQL语句来完成这个多表联合查询:
```sql
WITH recent_punchcards AS (
SELECT FID, MAX(T PunchCardTime) AS latest_date
FROM T_HR_ATS_PunchCardRecord
WHERE YEAR(FPunchCardTime) = YEAR(CURRENT_DATE) AND FPunchCardTime > DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)
GROUP BY FID
)
SELECT p.*
FROM t_bd_person p
JOIN recent_punchcards r ON p.FID = r.FID
ORDER BY r.latest_date DESC;
```
这里做了以下几步操作:
1. 使用`WITH`语句创建了一个名为`recent_punchcards`的临时表,其中包含每位员工(`FID`)在过去一年内最近一条打卡时间(`latest_date`),并且打卡日期超过了当前日期的前30天。
2. 主查询中,通过`JOIN`将`t_bd_person`表与`recent_punchcards`表连接起来,基于`FID`字段。
3. `SELECT p.*`表示选择`t_bd_person`表的所有列,得到每位员工的相关信息。
4. 结果按照最新打卡日期降序排列。
相关问题
写一段多表联合查询的sql server语句,通过T_HR_ATS_PunchCardRecord表查询每个员工FID今年最近的一条打卡记录,删选出打卡日期FPunchCardTime字段超过查询日期30天的数据,再通过这些数据的FID字段在t_bd_person表查询出信息
你可以使用以下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天的员工记录。
SQL 表T_ATS_RepairWO 关键字段ID 对应表 T_ATS_RWOSPAREPARTENTRY 查询怎么写
您可以使用以下 SQL 查询语句:
```
SELECT *
FROM T_ATS_RWOSPAREPARTENTRY
WHERE RepairWOID = (SELECT ID FROM T_ATS_RepairWO)
```
这个查询语句会从 `T_ATS_RWOSPAREPARTENTRY` 表中查询 `RepairWOID` 等于 `T_ATS_RepairWO` 表中的 `ID` 的所有行。
阅读全文
相关推荐
















