Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sqlite 3中优化表比较(联接)查询_Sql_Database_Sqlite - Fatal编程技术网

在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)