当另一个表中不存在匹配项时,从SQLite表中删除行

Mar*_*ski 23 sqlite left-join sql-delete

我需要删除SQLite表中的行,其中行ID在另一个表中不存在.SELECT语句返回正确的行:

SELECT * FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL;
Run Code Online (Sandbox Code Playgroud)

但是,delete语句会从SQLIte生成错误:

DELETE FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL;
Run Code Online (Sandbox Code Playgroud)

错误是:SQLite错误1 - 接近"左":语法错误.我可以使用另一种语法吗?

wim*_*vds 45

SQLite显然不支持与delete语句的连接,正如您在Syntax图表中看到的那样.但是,您应该能够使用子查询来删除它们.

即.

DELETE FROM cache WHERE id IN
(SELECT cache.id FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL);
Run Code Online (Sandbox Code Playgroud)

(未测试)


Igo*_*aka 13

既然你沿着子查询的路线走下去,也可以完全摆脱连接并简化查询:

DELETE FROM cache WHERE id NOT IN (SELECT id from main);
Run Code Online (Sandbox Code Playgroud)

  • 如果`main`包含数百万行,则不是理想的解决方案.最好先加入. (5认同)
  • @Jacob 希望有人一开始就没有在 sqlite 中处理数百万行。 (2认同)
  • @fluffy,不要小看SQLite :)使用它来处理数百万行是完全合理的,但是即使是几千行,这个“ SELECT id FROM”查询也是不必要的效率低下和缓慢。@winvds答案是一个更好的选择。 (2认同)