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
4

2 に答える 2

3

これを少し違う言い方にしましょう。DAYユーザーが列に対して AM と PM の両方をスケジュールしている場合、そのユーザーは利用できません。それ以外の場合、ユーザーは利用可能です。

その列に 2 つの値しかない場合、次のクエリは必要なフィルタリングを行います。

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(2 番目のケース) を返します。

于 2013-08-27T13:07:22.380 に答える
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') 
于 2013-08-27T13:05:36.120 に答える