【问题标题】:DB2 update query with select from different table使用从不同表中选择的 DB2 更新查询
【发布时间】:2022-01-02 00:04:13
【问题描述】:

有人可以帮我解决以下问题吗?

假设我有一个数据库,其中包含所有车辆和道路上方用于扫描车牌的某种雷达。在雷达扫描完车牌后,它会被添加到 DB2 数据库中。

第一个表包含所有已知的具有开始日期和可能结束日期的车辆。 每当汽车的颜色发生变化时,都会填写结束日期并创建一个新的记录并使用新的开始日期(这都是手动完成的)

第二个表格包含汽车驶过马路的时间。

Cars:

ID Plate color Start end
1 Name1 Blue 2021-01-01 2021-01-04
2 Name2 Red 2021-01-01 null
3 Name1 Purple 2021-01-05 null

Registrations:

ID Plate Date carID
1 Name1 2021-01-01 null
2 Name2 2021-02-01 null
3 Name1 2021-03-01 null
4 Name1 2021-04-01 null
5 Name1 2021-05-01 null

我们最近添加了 carID 列,但它需要被填充,所以最终它应该是这样的:

Registrations:

ID Plate Date carID
1 Name1 2021-01-01 1
2 Name2 2021-02-01 2
3 Name1 2021-03-01 1
4 Name1 2021-04-01 3
5 Name1 2021-05-01 3

我试图通过以下查询来做到这一点:

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 注册已更新,但是当我检查数据库时,实际上没有任何变化。

【问题讨论】:

  • Name1,是车主/司机的名字,还是汽车品牌?
  • 您描述的任何表格中都没有车牌列,如果在任何表格中为空,则更新将12902 carID设置为空

标签: sql db2


【解决方案1】:

我的意思是您需要在 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

【讨论】:

  • 提示一下,dbfiddle.uk 同时拥有 MySQL 和 DB2,因此您可以轻松检查查询是否适用于两者。
  • 与 MySQL 相比,DB2 是一个非常不同的引擎。我会删除这个答案。
  • @TheImpaler,你说得对。更新了 DB2 查询
  • 这给了我以下错误:标量全查询、SELECT INTO 语句或 VALUES INTO 语句的结果超过一行.. SQLCODE=-811,SQLSTATE=21000,DRIVER=4.16。 53
  • 这是因为表格 Cars 的开始日期有重叠。您应该修复它或使用聚合查询:dbfiddle.uk/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2023-04-09
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多