Db2/sql:使用连接选择和更新最旧的条目

Posted

技术标签:

【中文标题】Db2/sql:使用连接选择和更新最旧的条目【英文标题】:Db2/sql: Select & update oldest entries with join 【发布时间】:2020-11-22 21:57:52 【问题描述】:

如果有 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,通常为空 0001-01-01)和 p.time(格式:08.00.59,通常为空 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 个位置,但日期和时间相同(同一秒!)。我怎样才能删除这辆车的所有位置,除了重复条目的最后一行/位置(但前提是重复条目具有相同的日期和时间)?

谢谢..

【问题讨论】:

【参考方案1】:

如果我没听错的话:

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

【讨论】:

现在我遇到了这种情况,2 个位置被同一辆车挡住了,但日期和时间相同(同一秒!)。如何删除这辆车的所有位置,除了位置编号最大的 1 个位置(但仅限于重复的日期和时间数据)? 最好保留最后一个条目(重复id号的最后一行/位置),最旧的条目应该更新。非常感谢。 @Butterfly:您需要将子查询的where 子句更改为:and (p1.date > p.date or (p1.date = p.date and p1.time > p.time) or (p1.date = p.date and p1.time = p.time and p1.position > p.position)) 谢谢专线小巴。是否可以更改 where 子句,以便仅保留最后一行,我的意思是相同 ID 的最后一个条目,并且相同 ID 的倒数第二行的第一行将被更新?非常感谢..

以上是关于Db2/sql:使用连接选择和更新最旧的条目的主要内容,如果未能解决你的问题,请参考以下文章

Hazelcast - 最旧的条目首先被驱逐

Django在数据库中找到最旧的条目

DB2 SQL更新与子查询相关的多于1列[duplicate]

TSQL计算最旧和最新行之间的差异

在单个查询中选择两个特定的 mysql 表行

删除 SQL 中的重复行