sql - Db2/sql:使用连接选择和更新最旧的条目
问题描述
如果给定 2 个表:
汽车(字段:c.id、c.name、c.plate)
停车(字段:p.position、p.id、p.date、p.time)
当汽车进入停车区时,会在“Parking”表中存储 p.id(通常为空 '' 与 c.id 相同的条目)和 p.date(格式:2020-11-23,通常null 0001-01-01)和 p.time(格式:08.00.59,通常为 null 00.00.00)。
有时 i 系列上的程序会为 1 辆车预留多于 1 个停车位。
然后我必须找出这辆车最旧的条目,并且比字段 p.id ' ' 为空。只允许1辆车预留1个停车位。
如何将所有 thd 最旧的停车 p.id 字段更新为“”?只有最年轻的条目(根据 p.date 和 p.time 可以存在)?
例子:
C.id c.name c.plate
3643 volvo. H-FZ25
P.position p.id p.date. P.time
R154 3643 2020-11-22 04.34.44
R154 3643 2020-11-22 05.34.44
R154 3643 2020-11-22 07.34.44
只有最后一个条目可能保留,对于停车表的较旧条目,字段 p.id (' ')、p.date 和 p.time 应被清除。如何首先选择/显示这些重复的条目并更新它们?
对不起,我的英语不好。感谢您的快速帮助 GMB。
但是现在我遇到了这种情况,同一辆车阻止了 2 个位置,但日期和时间相同(同一秒!)。我怎样才能删除这辆车的所有位置,除了重复条目的最后一行/位置(但前提是重复条目具有相同的日期和时间)?
谢谢..
解决方案
如果我正确地跟随你:
update parking p
set pid = null, pdate = null, ptime = null
where exists (
select 1
from parking p1
where
p1.pid = p.pid
and (p1.date > p.date or (p1.date = p.date and p1.time > p.time))
)
基本上,这会将列设置nulls
为同一行存在较新行的行pid
。如果您想要空字符串,则可以set
相应地更改子句。
请注意,将日期和时间存储在两个单独的列中会使逻辑不必要地更加复杂。如果这些是字符串(就像它们看起来的那样),我们也可以将条件表述为:
and p1.date || p1.time > p.date || p.time
推荐阅读
- c# - 脚手架 API 控制器不同
- swift - 创建实例集 id,虽然它应该是 nil
- reactjs - 如何使用颜色数组更改按钮按下时的按钮背景颜色?
- domain-driven-design - DDD 有界上下文命名
- c# - 具有依赖注入的类的新实例 - C#
- c++ - 在 TCP_Client 程序中输入用户名后出现“调试断言失败”错误
- java - Java程序在主机上的终端中工作,但在我将项目目录同步到VM之后不能
- c# - 如何模拟 IConfiguration.GetValue
- python - RPi 温度监控和过热检测
- sql - PostgreSQL:我是否需要锁定表以避免在更新期间使用子查询在 JSONB 数组中查找索引或更新时出现并发错误?