来自临时 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_path
、md5sum
、inum
和其他一些人。当我插入值时,尚未生成 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
我想更新满足特定条件的每一行的特殊列。
这两个答案看起来很有希望,但是 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_path
、md5sum
、inum
和其他一些人。当我插入值时,尚未生成 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