在sqlite 3中优化表比较(连接)查询

时间:2015-01-21 09:37:38

标签: sql database sqlite

我有两个表audiofolder,其中包含以下架构

AUDIO

-------------------------------
ID | NAME | FILESIZE | FID
-------------------------------

FOLDER

-------------------------
ID | NAME
-------------------------

音频表保存从设备扫描的音频文件,文件夹表保存文件的文件夹。 现在我想要内容更改检测,以确定在后续设备扫描中是否有任何新设备添加/删除的新歌曲。所以我有两个副本表newaudionewfolder

因此,为了进行比较,我运行以下查询

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

有没有更好的opmtimized查询来做同样的事情?

修改

Audiofolder表保存上次扫描的条目。 现在,当我删除或添加歌曲并再次同步设备时,条目会显示在newaudionewfolder表中。

因此,新旧条目之间的比较。

对于下一次扫描,newaudionewfolder替换audio,再次创建foldernew*表,依此类推

EDIT2

目的只是检测内容变化 - 是或否。我并不关心更改的文件。

1 个答案:

答案 0 :(得分:0)

使用此查询获取新文件或已更改文件的列表:

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)