您正在开发一个闹钟应用程序,它的工作原理如下:用户可以设置日期和时间,并且该应用程序将在给定的时间每周响铃,从给定的日期开始,直到今年年底。
开始日期是以下结构的userinput表中的唯一记录:
输入日期:第一次报警的日期和时间(日期时间类型)。给定这个表,您的任务是用一个列组成结果表。此列应包含闹钟按升序响的所有日期(包括时间)。
输入1输入2
CREATE PROCEDURE alarmClocks()
BEGIN
select @a alarm_date
from userInput,
(select 1 union select 2 union select 3 union select 4) x,
(select 1 union select 2 union select 3 union select 4) y,
(select 1 union select 2 union select 3 union select 4) z
where year(ifnull(@a:=date_add(@a, interval 1 week), @a:=input_date))
= year(input_date);
END
我不懂这种语法
(select 1 union select 2 union select 3 union select 4) x
有人能给我解释一下吗?
1条答案
按热度按时间mkh04yzy1#
UNION
组合两个关系(例如SELECT
)通过将第二个操作数“从上到下”附加到第一个操作数。在你的例子中
SELECT 1
可能看起来像:以及
SELECT 2
:+---+
| 1 |
+===+
| 1 |
+---+
| 2 |
+---+
+---+
| 1 |
+===+
| 1 |
+---+
| 2 |
+---+
| 3 |
+---+
| 4 |
+---+
```
UNION
也消除了重复。就是这样SELECT 1 UNION SELECT 1
将导致:不会导致:
如果你想保留副本,你必须使用
UNION ALL
,这并不能消除重复项。所以呢SELECT 1 UNION ALL SELECT 1
将导致:还要注意,因为重复消除会导致开销
UNION ALL
如果一个人知道这个集合无论如何都不会有任何重复的话,这也是首选的。你的例子就是这样——我们知道{1,2,3,4}没有重复项。所以呢SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
是更好的选择(尽管如此小的一组的开销可以忽略不计)。更多信息:“13.2.10.3联合语法”