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

时间:2011-02-11 08:53:40

标签: sqlite left-join sql-delete

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

SELECT * FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL;

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

DELETE FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL;

错误是: SQLite错误1 - 靠近“左”:语法错误。我可以使用另一种语法吗?

3 个答案:

答案 0 :(得分:45)

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

即。

DELETE FROM cache WHERE id IN
(SELECT cache.id FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL);

(未经测试)

答案 1 :(得分:13)

由于你沿着子查询的路线走下去,不妨完全摆脱连接并简化查询:

DELETE FROM cache WHERE id NOT IN (SELECT id from main);

答案 2 :(得分:0)

@wimvds 的解决方案对我不起作用,所以我修改了查询并删除了 WHERE 条件:

DELETE FROM FirstTable WHERE firstTableId NOT IN (SELECT SecondTable.firstTableId FROM SecondTable LEFT JOIN FirstTable ON FirstTable.firstTableId=SecondTable.firstTableId)

这将删除 FirstTable 中所有没有将其 id 分配给 SecondTable 中任何行的行。