来自临时 table (CTE) 的 sqlite3 批量更新

sqlite3 bulk update from temporary table (CTE)

我想更新满足特定条件的每一行的特殊列。

这两个答案看起来很有希望,但是 sqlite3 (v 3.24.0) 抛出错误。

Update multiple rows with different values in a single SQL query

How to use CTE's with update/delete on SQLite?

我是这样做的:

WITH tmp(md5, abs_path) AS (VALUES
            ('7dc108663732380b2596ec643f4f9122', '/path1'),
            ('80f81e1ebea9a77a336d5d0b29fe8772', '/path2'),
            /* here will be many more lines later... */
            ('f42f5c59786de8de804bf1c0d2017e95', '/path3')
                )
UPDATE files SET
    md5sum=(
        SELECT md5 FROM tmp
        WHERE 
            files.absolute_path==tmp.abs_path
    )
WHERE
        files.last_seen_ts=1644002082
    AND
        files.volume_id=1111
    AND
        files.inum IN (SELECT inum FROM files WHERE files.absolute_path==tmp.abs_path)
;

错误是: Error: near line 1: no such column: tmp.abs_path

有人可以帮我吗?


编辑:谢谢你让我澄清。

table“文件”包含列

absolute_pathmd5suminum

和其他一些人。当我插入值时,尚未生成 md5 和,只有一个占位符。这是因为我有不同路径但相同 inum(硬链接)的文件。因此,为了避免不必要地多次计算相同的 md5 哈希,我在 md5 计算之前排除了 inum 的倍数。

我现在必须更新 table“文件”中的每个条目的 md5 总和,这些条目与我为其计算 md5 的条目具有相同的 inum,现在在“tmp”table 批量更新“文件”。为了实现这一点,我有 WHERE 条件来更新所有行,其中 inum 与 absolute_path 中的相同,必须与 tmp table 中的路径相同,其 md5 总和。所以:

files.inum IN (
SELECT inum FROM files 
WHERE files.absolute_path==tmp.abs_path
)

我希望现在我想要的更清楚了。

你应该只使用 UPDATE FROM 语法...

类似...

WITH
    tmp(md5, abs_path)
AS
(
    VALUES
        ('7dc108663732380b2596ec643f4f9122', '/path1'),
        ('80f81e1ebea9a77a336d5d0b29fe8772', '/path2'),
        /* here will be many more lines later... */
        ('f42f5c59786de8de804bf1c0d2017e95', '/path3')
)
UPDATE
    files
SET
    md5sum = tmp.md5
FROM
    tmp
WHERE 
        files.absolute_path = tmp.abs_path
    AND files.last_seen_ts  = 1644002082
    AND files.volume_id     = 1111