我正在开发一个具有一些调度功能的应用。作为其中的一部分,我需要选择一个人员列表,以及他们是否在一周的某个时段安排了某些事情。
一周中的句点数是可变的,因此它们存储在参考表中,例如:
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
完成的答案 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;