0

我正在开发一个具有一些调度功能的应用程序。作为其中的一部分,我需要选择一个人员列表,以及他们是否在一周的某个时间段安排了一些事情。

一周中的周期数是可变的,因此它们存储在参考表中,例如:

Period Reference Table

id   name       start                 end                     day
------------------------------------------------------------------
1    Morning    1900-01-01 4:00:00    1900-01-01 11:00:00     MON
2    Afternoon  1900-01-01 14:00:00   1900-01-01 20:00:00     MON  
3    Night      1900-01-01 20:00:00   1900-01-01 24:00:00     MON  
4    Morning    1900-01-01 4:00:00    1900-01-01 11:00:00     TUE
5    Afternoon  1900-01-01 14:00:00   1900-01-01 20:00:00     TUE  
6    Night      1900-01-01 20:00:00   1900-01-01 24:00:00     TUE 

我还有一个“人员参考”表和一个“人员日程”表。“person schedule”表只存储一个人在某个时间段内安排了某事的记录,这里是一个简化的例子:

Person Schedule Table

id    person_id     period_id
------------------------------
1     1             2
2     1             3
3     2             2
4     2             3
5     2             4

现在我需要从这三个表中选择每个人的完整时期列表,以及他们在该时期是否有时间表记录(1 或 0)。换句话说,我需要为上面的示例数据获取此结果集:

person_id     period_id     is_scheduled
----------------------------------------
1             1             0
1             2             1
1             3             1
1             4             0
1             5             0
1             6             0
2             1             0
2             2             1
2             3             1
2             4             1
2             5             0
2             6             0

是否可以在不进入动态 SQL 的情况下使用 select 语句来执行此操作?

这一切都是使用 SQL Server 2000 完成的

4

1 回答 1

1
SELECT 
  people.person_id, period_id = periods.id, is_scheduled = CASE
  WHEN schedule.person_id IS NOT NULL THEN 1 ELSE 0 END
FROM dbo.[period reference table] AS periods
CROSS JOIN 
(
  SELECT person_id 
    FROM dbo.[person schedule table] 
    GROUP BY person_id
) AS people
LEFT OUTER JOIN 
  dbo.[person schedule table] AS schedule
  ON people.person_id = schedule.person_id
  AND periods.id = schedule.period_id
ORDER BY 
  people.person_id, p.id;
于 2012-06-09T02:49:41.680 回答