【发布时间】:2019-10-21 18:17:21
【问题描述】:
我的表结构如下:
HID TIME_FROM LAG_TIME_FROM TIME_UNTIL
-------------------------------------------------------------------------
AAAAA12334566 06.07.19 04:04:51 13.07.19 04:05:17 13.07.19 04:05:17
AAAAA12334566 13.07.19 04:05:17 14.07.19 04:05:30 14.07.19 04:05:30
AAAAA12334566 14.07.19 04:05:30 23.07.19 22:00:00 23.07.19 22:00:00
AAAAA12334566 23.07.19 22:00:00 23.07.19 22:00:00 25.07.19 04:05:06
AAAAA12334566 23.07.19 22:00:00 25.07.19 04:05:06 22.07.19 22:00:00
AAAAA12334566 25.07.19 04:05:06 25.07.19 04:05:06 01.01.99 00:00:00
AAAAA12334566 25.07.19 04:05:06 01.01.99 00:00:00 24.07.19 04:05:06
BBBBBB12334566 29.06.18 14:59:20 01.02.19 14:25:00 01.02.19 14:25:00
BBBBBB12334566 01.02.19 14:25:00 07.03.19 04:07:48 07.03.19 04:07:48
BBBBBB12334566 07.03.19 04:07:48 05.07.19 04:04:47 09.07.19 04:04:52
BBBBBB12334566 05.07.19 04:04:47 06.07.19 04:04:51 09.07.19 04:04:52
BBBBBB12334566 06.07.19 04:04:51 08.07.19 13:00:45 09.07.19 04:04:52
BBBBBB12334566 08.07.19 13:00:45 08.07.19 13:18:19 12.07.19 04:04:44
我的表中存在HID、TIME_FROM 和TIME_UNTIL 列。 LAG_TIME_FROM 列由以下 SQL 语句生成,在表中不存在:
Select HID, TIME_FROM, nvl(lead(TIME_FROM) over(partition by HID order by TIME_FROM),timestamp '9999-01-01 00:00:00') LAG_TIME_FROM, TIME_UNTIL
from my_table
where HID in (
' AAAAA12334566 ',
' BBBBBB12334566 ',
' CCCCCC12334566 ',
' DDDDD12334566 ',
'EEEEEEE12334566 ',
'GGGGG12334566 ');
我要做的是通过上面写的sql语句(LAG_TIME_FROM)更新TIME_UNTIL列。这是我的尝试:
UPDATE my_table s1
SET TIME_UNTIL= (
select LAG_TIME_FROM from(
select HID, TIME_FROM, nvl(lead(TIME_FROM) over(partition by HID order by TIME_FROM),timestamp '9999-01-01 00:00:00') LAG_TIME_FROM, TIME_UNTIL
from my_table
) s2
Where s1.HID in (
' AAAAA12334566 ',
' BBBBBB12334566 ',
' CCCCCC12334566 ',
' DDDDD12334566 ',
'EEEEEEE12334566 ',
'GGGGG12334566 ')
and s1. hid = s2. hid
and s1. TIME_FROM = s2.TIME_FROM
and s1. TIME_UNTIL = s2. TIME_UNTIL
);
但是当我运行代码时出现以下错误:
ORA-01407: 无法将 TIME_UNTIL 更新为 NULL。
我不明白为什么会得到 NULLS,因为当我运行 sql 语句时:
Select HID, TIME_FROM, nvl(lead(TIME_FROM) over(partition by HID order by TIME_FROM),timestamp '9999-01-01 00:00:00') LAG_TIME_FROM, TIME_UNTIL
from my_table
where HID in (
' AAAAA12334566 ',
' BBBBBB12334566 ',
' CCCCCC12334566 ',
' DDDDD12334566 ',
'EEEEEEE12334566 ',
'GGGGG12334566 ');
一切看起来都很好
【问题讨论】:
-
为什么要这样做?您应该努力避免数据库中的冗余。最好创建一个视图,也许是一个物化视图。
标签: sql oracle sql-update