请帮我为 SQL Server 2008 创建这个 SQL 查询。
我已经浪费了 1 天的时间来思考这个问题,但我找不到解决方案:
我有 3 个 [tables] 和各自的(列):
[table_users]
TB1(Id, Name)
[table_schedule]
TB2(Id, userId, dateScheduled)
[table_schedule_confirmation]
TB3(Id, scheduleId, confirmationStatus)
确认状态 -> 0 = 取消,1 = 确认
我必须通过选择一天进行过滤[TB1]
,它必须仅列出以下用户名:
- 根本没有安排(在选定的日期
userId
不存在)[TB2]
或者
- 如果已安排,则 (
scheduleId
) 中有一个匹配的确认,[TB3]
并且 (confirmationStatus
) 必须为 0(已取消)
问题:
TB2
和日期TB3
中可以有多个条目userId
日期过滤器 = 31/03/2013
情况1(1个确认的时间表):
情况1 http://img255.imageshack.us/img255/1508/sqld.png
如您所见,我为用户 1 安排了 4 次,但他先取消了 3 次,仅在第 4 次确认。
情况 2(1 个待定时间表):
情况1 http://img854.imageshack.us/img854/8116/sql2s.png
在这种情况下,用户尚未确认第 4 个(id=16)计划。
情况 3(所有日程取消):
情况1 http://img41.imageshack.us/img41/5720/sql3s.png
用户取消了所有 4 个计划。
情况 4(该日期没有用户安排):
情况1 http://img255.imageshack.us/img255/9679/sql4.png
所选日期没有时间表。
在简历中:
按日期过滤,我必须仅列出适用于情况 3 和 4 而不适用于情况 1 和 2 的用户!
我必须制作此过滤器,以仅使用当天可用的用户填充下拉列表。
这是我迄今为止尝试过的:
DECLARE @dataAg datetime SET @dataAg = '2013/03/31 16:30'
SELECT T1.id, T1.name
FROM [tbl_users] T1
WHERE
(NOT EXISTS
(SELECT *
FROM [tbl_schedule] T2
WHERE T2.userId = T1.id
AND CONVERT(date,T2.scheduledDate) = CONVERT(date, @dataAg))
)
OR
(EXISTS
(SELECT *
FROM [tbl_schedule] T2, [tbl_scheduleConfirmation] T3
WHERE T2.id = T3.idSchedule
AND T2.userId = T1.id
AND CONVERT(date,T2.scheduledDate) = CONVERT(date, @dataAg))
AND
NOT EXISTS
(SELECT *
FROM [tbl_schedule] T2, [tbl_scheduleConfirmation] T3
WHERE T2.id = T3.idSchedule
AND T3.confirmation = 1
AND T2.idUser = T1.id
AND CONVERT(date, T2.scheduledDate) = CONVERT(date, @dataAg))
)