Afficher tous les users disponibles un jour donné

Je veux afficher tous les users disponibles (type d'user: employé) à une date donnée. Ils ne sont pas disponibles s'ils sont programmés les deux jours (PM / AM)

Voici mes tables suivantes:

Types d'users

TypeID TypeName 1 Admin 2 Employee 

Utilisateurs

 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 

Programme

 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 

Résultat attendu (WHERE SchedDate = '8/27/2013')

 UserID Name 3 Employee 2 5 Employee 3 6 Employee 4 7 Employee 5 

C'est ma déclaration SQL actuelle:

 SELECT Users.UserID, Users.Name FROM Users LEFT OUTER JOIN Schedule ON Schedule.UserID = Users.UserID WHERE Users.TypeID = 5 

Disons ceci un peu différemment. Un user n'est pas disponible si AM et PM sont programmés pour la colonne DAY . Sinon, l'user est disponible.

Étant donné qu'il n'y a que deux valeurs dans cette colonne, la requête suivante effectue le filtrage souhaité:

 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; 

Si vous savez que les valeurs ne sont jamais répétées, vous pouvez modifier la clause having pour:

 HAVING COUNT(*) < 2; 

C'est un peu un truc. Quand il n'y a aucune correspondance dans la table de planification, les counts renvoient 0 (dans le premier cas) ou 1 (dans le second cas).

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