更新对子查询的引用(sqlite)

Update referencing on subquery (sqlite)

我有一个 table 和文件的 md5 总和,并使用以下查询查找存在于一个散列中的文件-运行 而不是另一个(oldt 与 newt):

SELECT *
FROM md5_sums as oldt
WHERE NOT EXISTS (SELECT *
                  FROM md5_sums as newt
                  WHERE oldt.file = newt.file
                  and oldt.relpath = newt.relpath
                  and newt.starttime = 234)
and oldt.starttime = 123

现在我想在带有更新子句的额外列中放置一个标志,例如

update md5_sums
set only_in_old = 'X'
where

我想引用上层查询作为子查询,但我找不到合适的方法。是否有可能将上层查询的结果用于更新查询的 where 子句? (我现在添加了一些 Table 带有简单 Table 数据的屏幕截图)

Table 说明

Table更新前的数据

需要 Table 更新后的数据

我希望这可以帮助您将 select 语句转换为更新语句,

UPDATE md5_sums 
SET only_in_old = 'X'

WHERE NOT EXISTS (SELECT *
                  FROM md5_sums newt
                  WHERE file = newt.file
                  and relpath = newt.relpath
                  and newt.starttime = 1551085649.7764235)
and starttime = 1551085580.009046

SQLite 不支持别名更新 table。
在你的情况下你不需要那个。
您可以在子查询中使用 table 的名称 md5_sums,因为您将 SELECT 语句的 table 别名为 newt.

UPDATE md5_sums 
SET only_in_old = 'X'
WHERE NOT EXISTS (
  SELECT 1 FROM md5_sums AS newt
  WHERE md5_sums.file = newt.file
  AND md5_sums.relpath = newt.relpath
  AND newt.starttime = 234
)
AND starttime = 123

参见demo
结果:

| file    | relpath  | starttime | only_in_old |
| ------- | -------- | --------- | ----------- |
| abc.txt | /var/tmp | 123       |             |
| abc.txt | /var/tmp | 234       |             |
| def.txt | /tmp     | 123       | X           |
| xyz.txt | /tmp     | 234       |             |