2013-08-27 4 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/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

Попытка понять логику, почему UserID 3 не включен в ожидаемый результат? – Gidil

+0

@ Gidil. , , Согласно логике в тексте, UserId 3 должен быть возвращен. Насколько это возможно. –

+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

Ваш запрос почти правильный. Вам просто нужно использовать «ИЛИ НЕ СУЩЕСТВУЮТ», а не «И НЕ СУЩЕСТВУЕТ», чтобы возвращались пользователи 5 и 6, потому что у них нет «AM», или у них нет «PM» – Teevus

+1

Только что оставлено, (средний «И» должен быть «ИЛИ») – Mikkey

3

фраза Давайте это немного по-другому. Пользователь недоступен, если пользователь имеет как AM, так и PM, запланированные для столбца DAY. В противном случае пользователь доступен.

Учитывая, что есть только два значения в этом столбце, следующий запрос выполняет фильтрацию вы хотите:

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 (во втором случае).

Смежные вопросы