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

时间:2019-02-25 10:16:50

标签: sql sqlite

我有一个表,其中包含文件的md5总和,并使用以下查询查找存在于一个哈希运行中而不存在于另一个哈希运行中的文件(oldt vs 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

,在那里我想引用上层查询作为子查询,但是我找不到正确的方法。是否可以将上层查询的结果用于update-query的where子句? (我现在添加了一些带有简单表格数据的表格屏幕截图)

表说明 Table Description

UPDATE之前的表数据 Table Data before UPDATE

UPDATE之后所需的表数据 desired Table Data after UPDATE

2 个答案:

答案 0 :(得分:1)

SQLite不支持对更新的表进行别名。
在您的情况下,您不需要。
您可以在子查询中使用表名md5_sums,因为您将SELECT语句的表别名为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       |             |

答案 1 :(得分:0)

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

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