从不同表中选择DB2更新查询

ar7v8xwq  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(172)

有人能帮我解决以下问题吗?
假设我有一个数据库,里面有所有的车辆,还有一个雷达,它在道路上方扫描车牌,当雷达扫描车牌后,它就被添加到DB2数据库中。
第一个表包含所有已知的具有开始日期和可能的结束日期的车辆。每当汽车的颜色改变时,结束日期将被填充,并且将使用新的开始日期创建新的记录(这都是手动完成的)
第二个表包含汽车何时驶过道路。
Cars
| 识别码|印版|色彩|启动时间|结束|
| - -|- -|- -|- -|- -|
| 一个|名称1|蓝色|2021年1月1日|2021年1月4日|
| 2个|名称2|红色|2021年1月1日|零值|
| 三个|名称1|紫色|2021年1月5日|零值|
Registrations
| 识别码|印版|日期|卡ID|
| - -|- -|- -|- -|
| 一个|名称1| 2021年1月1日|零值|
| 2个|名称2| 2021年2月1日|零值|
| 三个|名称1| 2021年3月1日|零值|
| 四个|名称1| 2021年4月1日|零值|
| 五个|名称1| 2021年5月1日|零值|
我们最近添加了carID列,但需要填充它,因此最后它应该如下所示:
Registrations
| 识别码|印版|日期|卡ID|
| - -|- -|- -|- -|
| 一个|名称1| 2021年1月1日|一个|
| 2个|名称2| 2021年2月1日|2个|
| 三个|名称1| 2021年3月1日|一个|
| 四个|名称1| 2021年4月1日|三个|
| 五个|名称1| 2021年5月1日|三个|
我尝试使用以下查询来完成此操作:

UPDATE registrations r
SET r.carID = ( 
                SELECT  c.ID 
                FROM cars c
                WHERE c.plate= r.plate 
                AND r.date >= c.start 
                AND r.date < c.end 
                OR c.plate= r.plate 
                AND  r.date >= c.start 
                AND c.end = null
                )

查询运行后,我得到的结果是12902个注册已更新,但当我检查数据库时,实际上没有任何更改。

t9aqgxwy

t9aqgxwy1#

我的意思是,你需要在where语句中设置右括号,并将= null替换为is null

UPDATE registrations r
SET r.carID = ( 
    SELECT  c.ID 
    FROM cars c
    WHERE c.plate = r.plate AND 
          r.date >= c.start AND 
          (r.date <= c.end OR c.end is null)
);

DB2 online fiddle

相关问题