我有一个包含以下字段的表格:
DailyWork(ID, WorkerID, FromHour, ToHour)
假设所有字段都是INT
类型
此表格需要在T_SQL
语句中进行扩展,才能成为JOIN
的一部分
通过展开一行,我的意思是,为FromHour
和ToHour
范围内的每个数字生成一小时。然后将其与声明的其余部分一起加入。
示例:
假设,我有另一个这样的表:Worker(ID, Name)
。一个简单的SELECT
语句就像这样:
SELECT * FROM
Worker JOIN DailyWork ON Worker.ID = DailyWork.WorkerID
结果的列类似于:WorkerID, Name, DailyWorkID, WorkerID, FromHour, ToHour
但是,我需要的是这样的列:WorkerID, Name, Hour
事实上,FromHour
和ToHour
的范围已扩大。并且每个单独的小时放在Hour
列中的单独行中
虽然我读了类似的问题to generate a range of number,但它并没有真正帮助。
答案 0 :(得分:1)
我从一个数字列表开始,然后这很容易。通常,表master.spt_values
用于此目的:
with nums as (
select row_number() over (order by (select null)) - 1 as n
from master.spt_values
)
select dw.*, (dw.fromhour + nums.n) as specifichour
from dailywork dw join
nums
on dw.tohour >= dw.fromhour + nums.n;
表master.spt_values
通常至少有几千行。
答案 1 :(得分:0)
另一个解决方案是......
WITH [DayHours] AS (
SELECT 1 AS [DayHour]
UNION ALL
SELECT [DayHour] + 1 FROM [DayHours] WHERE [DayHour] + 1 <= 24
)
SELECT [Worker]
JOIN [DayHours] ON [Worker].[FromHour] <= [DayHours].[DayHour]
AND [Worker].[ToHour] >= [DayHours].[DayHour]