Sql 查找过去1年内未休过一次假的员工
我有以下列的表格:Sql 查找过去1年内未休过一次假的员工,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有以下列的表格: Employee24( EMPLOYEEID, FIRSTNAME, LASTNAME, GENDER ); Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE); 我想写一个查询,查找在过去1年中没有休过一次假的员工 SELECT FIRSTNAME, LASTNAME FROM EMPLOYEE24 E INNER JOIN ON LEAVE25 L WHERE E.EMPLOYEEID = L.EMP
Employee24( EMPLOYEEID, FIRSTNAME, LASTNAME, GENDER );
Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE);
我想写一个查询,查找在过去1年中没有休过一次假的员工
SELECT FIRSTNAME, LASTNAME FROM EMPLOYEE24 E INNER JOIN ON LEAVE25 L WHERE E.EMPLOYEEID = L.EMPLOYEEID AND L.EMPLOYEEID = NULL AND STARTDATE > ADD_MONTHS(SYSDATE, -12)
您可以使用下面的查询查找过去一年未休假的员工
SELECT E.EMPLOYEEID, E.FIRSTNAME, E.LASTNAME, MAX(L.STARTDATE), MAX(L.ENDDATE)
FROM EMPLOYEE24 E LEFT JOIN
LEAVE25 L
ON E.EMPLOYEEID = L.EMPLOYEEID
GROUP BY E.EMPLOYEEID, E.FIRSTNAME, E.LASTNAME
HAVING COALESCE(MAX(L.STARTDATE),date'1900-01-01') < ADD_MONTHS(SYSDATE,-12)
在您的情况下使用NOT IN是合适的,如下所示:
SELECT FIRSTNAME, LASTNAME
FROM EMPLOYEE24 E
WHERE E.EMPLOYEEID NOT IN ( SELECT L2.EMPLOYEEID
FROM LEAVE25 L2
WHERE STARTDATE >= ADD_MONTHS(SYSDATE, -12) );
您不一定需要使用联接和子查询。您只需使用以下工具即可:
SELECT E.*
FROM Employee24 E
WHERE NOT EXISTS (SELECT NULL FROM Leave25 L
WHERE E.EMPLOYEEID=L.EMPLOYEEID
AND (STARTDATE>=SYSDATE-INTERVAL '12' MONTH
OR ENDDATE>=SYSDATE-INTERVAL '12' MONTH));
请参阅a。是否要从当前日期开始计算?还是今年的最后一年?@VenkataramanR自当前日期感谢您的回复。它给了我错误ORA-00918:含糊不清的列defined@user2147357 . . . 该查询已修复,但仍然不正确,因为它要求员工在某个时间休假。@GordonLinoff,已修复。谢谢你对这一点的额外关注。真的需要左连接吗?但是如果你在小提琴中删除了这一行,它仍然会得到相同的结果吗?@LukStorms很酷,是的,你是对的,表EMPLOYEE24已经足够选择FIRSTNAME,LASTNAME了。
SELECT E.*
FROM Employee24 E
WHERE NOT EXISTS (SELECT NULL FROM Leave25 L
WHERE E.EMPLOYEEID=L.EMPLOYEEID
AND (STARTDATE>=SYSDATE-INTERVAL '12' MONTH
OR ENDDATE>=SYSDATE-INTERVAL '12' MONTH));