首页 > 解决方案 > Db2/sql:使用连接选择和更新最旧的条目

问题描述

如果给定 2 个表:

当汽车进入停车区时,会在“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 个位置,但日期和时间相同(同一秒!)。我怎样才能删除这辆车的所有位置,除了重复条目的最后一行/位置(但前提是重复条目具有相同的日期和时间)?

谢谢..

标签: sqldatetimedb2sql-updatesubquery

解决方案


如果我正确地跟随你:

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

推荐阅读