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:使用连接选择和更新最旧的条目的主要内容,如果未能解决你的问题,请参考以下文章