我需要跟踪目录中创建的更改并保存历史记录。我有一个函数扫描该目录中的文件,然后将它们插入表中。让我们说这个程序第一次在那里运行文件A和B.结果表应该看起来像
FileID File DateModified
1 A 101010
2 B 020202
假设用户修改了文件B,因此下次程序运行时该表应如下所示:
FileID File DateModified
1 A 101010
2 B 020202
3 A 101010
4 B 030303
从上面的表格中我们知道文件B已被更改,因为它具有不同的修改日期,并且文件A未被修改。此外,我的程序知道插入的记录是fileID大于2的所有记录。我怎么能执行一个选择,它将返回最后一个文件B,因为该文件已被修改。我希望能够知道哪些文件已被修改,我如何构建该查询。
请先阅读以上内容以了解此部分。这是另一个例子。
First time program runs:
FileID File DateModified
1 X 101010
2 Y 020202
Next time program runs:
FileID File DateModified
1 X 101010
2 Y 020202
3 Y 020202
4 A 010101
到目前为止,我们知道文件X已被删除,因为它未包含在新扫描中。此外,我们知道已创建文件A.最后,文件Y没有被修改,它是相同的。我想执行一个选择,在这种情况下我可以获取创建或修改的文件,例如文件A.
我正在寻找类似的东西:
select * from table1 where fileID > 2 AND File NOT IN (SELECT File FROM table1 WHERE File <=2) AND DateModified NOT IN (SELECT DateModified FROM table1 WHERE File <=2)
我不知道为什么当我执行这样的查询时,我会得到不同的结果。也许我必须将File和DateModified分组到一个列中以使其工作。
答案 0 :(得分:2)
我会添加一个名为scan_number
的列,以便您可以将最新扫描与上一次扫描进行比较。
SELECT curr.file, prev.file, curr.DateModified, prev.DateModified
FROM table1 curr
LEFT
JOIN table1 prev
on curr.file = prev.file
and curr.scan_number = 100
and prev.scan_number = 99
WHERE curr.DateModified != prev.DateModified
OR curr.file IS NULL
OR prev.file IS NULL
如果要捕获插入和删除,则需要完全外连接,但似乎sqlite不支持。您可能必须运行两次查询,一次查找插入和更新,一次查找删除。
答案 1 :(得分:0)
DateModified
被要求执行太多工作:它用于跟踪给定日期的给定文件名的文件修改日期和存在证明。< / p>
您可以将另一列ScanId
,一个外键添加到新表ScanDates
,该表记录扫描ID和扫描运行的日期。
这样,您可以使用给定的ScanId
检查所有结果,并与任何选定的先前扫描进行比较,还跟踪文件的实际修改日期。