在sqlite 3中优化表比较(联接)查询
我有两个具有以下模式的表和文件夹 音频 文件夹在sqlite 3中优化表比较(联接)查询,sql,database,sqlite,Sql,Database,Sqlite,我有两个具有以下模式的表和文件夹 音频 文件夹 ------------------------- ID | NAME ------------------------- 音频表保存从设备扫描的音频文件,文件夹表保存文件的文件夹。 现在我需要内容更改检测,以确定在设备的后续扫描中是否有任何新歌曲添加/删除。所以我有两个复制表newaudio和newfolder 因此,为了进行比较,我运行以下查询 select case when (select count(audio.id) from aud
-------------------------
ID | NAME
-------------------------
音频表保存从设备扫描的音频文件,文件夹表保存文件的文件夹。
现在我需要内容更改检测,以确定在设备的后续扫描中是否有任何新歌曲添加/删除。所以我有两个复制表newaudio和newfolder
因此,为了进行比较,我运行以下查询
select case
when (select count(audio.id) from audio,newaudio where audio.filesize=newaudio.filesize and audio.name=newaudio.name and (select name from folder where id=audio.pid)=(select name from newfolder where id=newaudio.pid))=(select count(*) from newaudio)
then 1
else 0
end as matchResult
有没有更好的optimized查询来做同样的事情
编辑
音频和文件夹表保存上次扫描的条目。
现在,当我删除或添加歌曲并再次同步设备时,条目会进入newaudio和newfolder表
因此,比较是在新旧条目之间进行的
对于下一次扫描,将再次创建newaudio和newfolder replace audio以及folder和new*表,依此类推
编辑2
其目的只是检测内容更改-是或否。我不关心更改的文件。使用此查询获取新文件或更改文件的列表:
SELECT id, name, filesize, fid
FROM newaudio
EXCEPT
SELECT id, name, filesize, fid
FROM audio
使用此查询可获取已删除文件的列表:
SELECT *
FROM audio
WHERE id NOT IN (SELECT id
FROM newaudio)
删除文件时,文件夹表中的记录也会被删除?@JanWalczak:请查看编辑。这些查询将等于扫描表两次,一次是新文件/更改的文件,一次是删除的文件。所以我不确定这会比我的查询慢。
SELECT *
FROM audio
WHERE id NOT IN (SELECT id
FROM newaudio)