выберите записи, которые не существуют в выборе - PullRequest
0 голосов
/ 15 июня 2011

Мне нужно отслеживать изменения, созданные в каталоге, а также сохранить историю.У меня есть функция, которая сканирует файлы в этом каталоге, а затем вставляет их в таблицу.скажем, что в первый раз эта программа была запущена там, где файлы 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 ]

2 голосов
/ 15 июня 2011

Я бы добавил столбец с именем 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 этого не поддерживает. Возможно, вам придется выполнить запрос дважды, один раз, чтобы найти вставки и обновления, и один раз, чтобы найти удаления.

0 голосов
/ 15 июня 2011

DateModified просят выполнить слишком много заданий: он используется для отслеживания как даты изменения файла , так и подтверждения существования для данного имени файла на данную дату.

Вы можете добавить другой столбец, ScanId, внешний ключ к новой таблице ScanDates, в которой записан идентификатор сканирования и дата запуска сканирования.

Таким образом, вы можете проверить все результаты.с данным ScanId и сравнить с любым выбранным предыдущим сканированием, а также отслеживать реальные даты изменения ваших файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...