如果未设置值,则 SQLite 将具有匹配校验和的记录设置为相同的值

SQLite set records with matching checksums to same value if value is not set

我有一个包含图像的 table:imageArchive

如果具有给定校验和的一条记录具有用户 ID,如何将具有该校验和的所有记录设置为已知用户 ID?

我已经达到了:

select imageChksum from imageArchive 
where userId != "NULL"
group by imagechksum

这给了我一组具有 userIds

的已知校验和

和:

select * from imageArchive 
where imagechksum in
(select imageChksum from imageArchive 
where userId != "NULL"
group by imagechksum)

这给了我要设置的目标列表。但是我对如何设置它们一无所知……可能很简单?我在 SQL 方面几乎是自学成才,通常会在代码中做这样的事情,但我觉得我可能接近

您可以使用 window 函数:

select imageChksum, max(userid) over(partition by imageChksum) as userid
from imageArchive

请注意,如果有两个不同的用户分配给同一个校验和,将选择最大的 id。

如果你想要一个 update 语句,我会推荐相关子查询:

update imageArchive
set userid = (select max(ia1.userid) from imageArchive ia1 where ia1.imageChksum = imageArchive.imageChksum)
where 
    userid is null 
    and exists (select 1 from imageArchive ia1 where ia1.imageChksum = imageArchive.imageChksum)