SQLite跨双数据库多表JOIN查询:文件SHA值差异校验
解决SQLite跨库对比绝对路径文件SHA差异的问题
要精准找出两个库中绝对路径相同但SHA校验和不同的文件,核心是先分别生成每个库的绝对路径+SHA的唯一数据集,再通过绝对路径关联对比,避免因paths表ID不一致导致的重复关联。
完整SQL语句
首先需要将第二个数据库挂载到当前连接(假设db2的文件路径为path/to/db2.db):
ATTACH 'path/to/db2.db' AS db2;
然后执行对比查询:
SELECT db1_data.abs_path, db1_data.sha AS sha_from_db1, db2_data.sha AS sha_from_db2 FROM ( -- 生成db1中所有文件的绝对路径与SHA SELECT rtrim(p.path, '/') || '/' || ltrim(f.relative_path, '/') AS abs_path, f.sha FROM db1.files f JOIN db1.paths p ON f.path_prefix_index = p.id ) db1_data INNER JOIN ( -- 生成db2中所有文件的绝对路径与SHA SELECT rtrim(p.path, '/') || '/' || ltrim(f.relative_path, '/') AS abs_path, f.sha FROM db2.files f JOIN db2.paths p ON f.path_prefix_index = p.id ) db2_data ON db1_data.abs_path = db2_data.abs_path WHERE db1_data.sha != db2_data.sha;
关键说明
- 路径拼接优化:用
rtrim和ltrim处理路径的斜杠,避免因paths.path末尾带斜杠、files.relative_path开头带斜杠导致拼接出//,或者两边都不带斜杠导致路径断裂,保证绝对路径的一致性。 - 避免重复的核心:子查询会为每个库生成唯一的绝对路径记录(因为绝对路径本身是唯一标识),后续通过绝对路径做INNER JOIN时,不会出现多对多关联导致的重复行。
- 结果精准性:仅筛选SHA值不同的记录,直接输出差异文件的绝对路径及两个库中的SHA值,符合需求。
内容的提问来源于stack exchange,提问作者Dennis R
相关产品推荐
相关产品推荐

