-2

请帮我为 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))
          )
4

2 回答 2

0

最后我得到了它。

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
(
NOT EXISTS
    (
        SELECT * FROM [tbl_schedule] T2 WHERE
        NOT EXISTS
        (
            SELECT * FROM [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.userId = T1.id AND CONVERT(date,T2.scheduledDate) = CONVERT(date,@dataAg)
    )
)

不管怎么说,还是要谢谢你。

于 2013-03-27T03:15:06.433 回答
0

假设您想要 TB1 中的所有列,此查询应该可以满足您的需求。

SELECT * 
FROM TB1 
WHERE ID IN 
      (SELECT ID 
       FROM TB3 
       WHERE confirmationStatus = 1 
         AND scheduleID IN 
             (SELECT ID 
              FROM TB2 
              WHERE DATE(dateScheduled) = 'YOUR_ENTERED_DATE'))

将来,您可能还希望包含您正在使用的内容(mySQL、SQL Server 等)

于 2013-03-26T16:04:28.747 回答