想要在SQL视图中复制行

时间:2016-06-02 10:41:37

标签: sql

我有一个包含预订的reservations表格,例如:

       date      beg      end
------------  -------  -------
'2016-06-02'  '09:00'  '12:00'
'2016-06-03'  '14:00'  '17:00'
'2016-06-04'  '09:00'  '17:00'

我需要将其转换为以下视图:

       date      beg      end    tod
------------  -------  -------  ----
'2016-06-02'  '09:00'  '12:00'  'AM'
'2016-06-03'  '14:00'  '17:00'  'PM'
'2016-06-04'  '09:00'  '17:00'  'AM'
'2016-06-04'  '09:00'  '17:00'  'PM'

其中添加的列是tod(用于一天中的时间),以及 - 这是困难的部分 - 包含跨越整天的预订的重复项。

注意 - 在13:00之前开始的预订仅被视为仅限AM。 13:00后结束的预订仅被视为PM。从13:00开始到13:00之后结束的预订被视为AM和PM,这是行必须重复的原因。

我尝试过JOIN命令以便能够获得"倍增因子",但加入条件ON是强制性的,我不会#39;看看它可能是什么,也不应该与我合并的虚拟表的结构。

任何提示都可以帮助我继续完成这项任务?谢谢!

3 个答案:

答案 0 :(得分:3)

这似乎是一个奇怪的要求,但union all似乎是要走的路:

select date, beg, end, 'AM' as tod
from reservations r
where beg < '13:00'
union all
select date, beg, end, 'PM' as tod
from reservations r
where end >= '13:00';

答案 1 :(得分:0)

试试这个:

SELECT t1.*, t2.v
FROM mytable AS t1
LEFT JOIN (SELECT 1 AS id, 'AM' AS v UNION ALL SELECT 2, 'PM') AS t2
ON IF(t1.`beg` < '13:00', 'AM', 'PM') = t2.v OR
   IF(t1.`end` < '13:00', 'AM', 'PM') = t2.v
ORDER BY t1.`date`, t2.id   

以上查询使用内联表:

 id   v
----+----
 1  | AM
----+----
 2  | PM
----+----

ON谓词基本上是重复的行,从13:00开始到13:00之后结束。

答案 2 :(得分:0)

你可以&#34;乘以&#34;连接到常量表的行:

select *
from T
cross apply (
 select *
 from values ((1), (2)) x(number)
) x

这使所有行加倍。您可以非常灵活地使用此模式。例如,您可以在交叉应用中使用计算值,也可以通过向交叉应用添加where来减少变量行数。

戈登的union all解决方案也有效。它会导致不同的查询计划。