我有一个表示文件和目录层次结构的数据库表,具有以下结构(简化):
项目 ID int 路径文字 输入 int(0 表示文件,1 表示目录) ParentId int BackupTime 日期时间
目前该BackupTime
列仅用于文件,对于目录,它设置为 null。
现在我还需要为目录填写此列:它必须是BackupTime
所有后代(文件和目录)中的最小值。
这个(幼稚且低效的)查询说明了我想要做什么:
update Items i
set BackupTime = (select min(BackupTime)
from Items d
where d.Path like i.Path || '%'
and d.Type = 0)
where i.Type = 1
我的问题是我似乎找不到有效的方法。上面的查询在大量数据上耗时太长(该表通常包含超过 100K 行)
min(BackupTime)
搜索唯一的直接子代可能会更快:
update Items i
set BackupTime = (select min(BackupTime)
from Items d
where d.ParentId = i.ItemId)
where i.Type = 1
但要做到这一点,我必须确保后代将在其祖先之前更新,因此我必须自下而上递归地遍历层次结构。问题是我没有简单的方法知道哪些项目在层次结构中最深。我正在使用 SQLite,所以我不能使用分层查询。
关于如何有效地做到这一点的任何想法?
理想情况下,我希望能够在单个 UPDATE 查询中执行此操作,但如果不可能,我愿意接受其他选项,只要它们有效