2011-02-11 83 views
22

我需要删除SQLite表中其行表不存在于另一个表中的行的SQLite表中的行。 SELECT语句返回正确的行:当另一个表中不存在匹配时从SQLite表中删除行

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

然而,delete语句从源码产生一个错误:

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

的错误是:SQLite的错误1 - 近 “左”:语法错误。是否有另一种语法可以使用?

+0

要解释一下:我正在删除“主”表中的行使用额外的where条件,以保留用户已标记为“已锁定”的任何行(即不应删除,直到解锁): DELETE FROM main WHERE id =? AND locked = 0; 每次成功删除后都必须从“缓存”表中删除匹配的行,但SQlite不会返回一个值,该值可以让我知道第一条删除语句是否实际上与任何行匹配。因此,我试图从缓存表中删除“不匹配”的行,并在左连接上挂钩。 – 2011-02-11 08:59:01

回答

40

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

(未测试)

+0

谢谢!在阅读您的答案之前,我已经非常接近这一点,除了我使用equals而不是IN之外,所以我的尝试没有像预期的那样工作。 – 2011-02-11 16:56:40

12

既然你下去子查询的路线,不妨摆脱加入干脆简化查询:

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

如果`main`包含数百万行,则不是理想的解决方案。最好先做连接。 – Jacob 2013-03-28 05:07:25

相关问题