我想在给定的计划日期显示所有可用用户(用户类型:员工)。如果安排在白天(PM / AM)
,则无法使用它们以下是我的下表:
用户类型
TypeID TypeName
1 Admin
2 Employee
用户
UserID TypeID Name
1 1 Admin 1
2 2 Employee 1
3 2 Employee 2
4 1 Admin 2
5 2 Employee 3
6 2 Employee 4
7 2 Employee 5
定时
SchedID UserID SchedDate Day (PM/AM)
1 2 8/27/2013 PM
2 2 8/27/2013 AM
3 3 8/27/2013 AM
4 5 8/27/2013 PM
5 6 8/27/2013 AM
预期结果(WHERE SchedDate ='8/27/2013')
UserID Name
3 Employee 2
5 Employee 3
6 Employee 4
7 Employee 5
这是我当前的SQL语句:
SELECT Users.UserID, Users.Name FROM Users LEFT OUTER JOIN
Schedule ON Schedule.UserID = Users.UserID WHERE Users.TypeID = 5
答案 0 :(得分:3)
让我们用不同的方式来表达这一点。如果用户同时为DAY
列安排了AM和PM,则用户不可用。否则,用户可用。
鉴于该列中只有两个值,以下查询会执行您想要的过滤:
SELECT u.UserID, u.Name
FROM Users u LEFT OUTER JOIN
Schedule s
ON s.UserID = u.UserID and
s.ScheduleDate = '2013-08-27'
WHERE u.TypeID = 5
GROUP BY u.UserID, u.Name
HAVING COUNT(distinct s.day) < 2;
如果您知道值永远不会重复,那么您可以将having
子句更改为:
HAVING COUNT(*) < 2;
这是一个小技巧。如果计划表中根本没有匹配,则计数将返回0
(在第一种情况下)或1
(在第二种情况下)。
答案 1 :(得分:1)
SELECT USERS.USERID,
USERS.NAME
FROM USERS
WHERE NOT EXISTS (SELECT SCHEDID
FROM SCHEDULE
WHERE SCHEDULE.USERID = USERS.USERID
AND DAY = 'AM')
AND NOT EXISTS (SELECT SCHEDID
FROM SCHEDULE
WHERE SCHEDULE.USERID = USERS.USERID
AND DAY = 'PM')