选择select中不存在的记录

时间:2011-06-15 00:12:49

标签: sql sqlite

我需要跟踪目录中创建的更改并保存历史记录。我有一个函数扫描该目录中的文件,然后将它们插入表中。让我们说这个程序第一次在那里运行文件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分组到一个列中以使其工作。

2 个答案:

答案 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检查所有结果,并与任何选定的先前扫描进行比较,跟踪文件的实际修改日期。