2013-08-27 26 views
1

我想在给定日程安排日期显示所有可用用户(用户类型:员工)。他们不提供,如果他们被安排白天(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 /二千〇一十三分之二十七')

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

试图理解逻辑,为什么用户ID 3不包含在预期的结果中? – Gidil

+0

@Gidil。 。 。根据文本中的逻辑,应该返回UserId 3。据我所知,它相当于ID 7。 –

+1

Ooops。忘了添加:) – abramlimpin

回答

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') 
+0

我认为USERIDs 5和6不会与您的查询一起返回。 – Gidil

+0

你的查询几乎是正确的。你只需要使用“OR NOT EXISTS”而不是“AND NOT EXISTS”,以便用户5和6返回,因为他们没有'AM'或者他们没有'PM' – Teevus

+1

只剩下一个想念abram (中间的“AND”shd是“或”) – Mikkey

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(在第二种情况下)。

相关问题