2013-08-27 29 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(在第二種情況下)。

相關問題