我可以作为一种模板加入参考表中的所有行吗?

时间:2012-06-09 01:54:34

标签: sql sql-server join sql-server-2000

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

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

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 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

是否可以使用select语句执行此操作而无需进入动态SQL?

这都是使用SQL Server 2000

完成的

1 个答案:

答案 0 :(得分: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;