Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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表中删除行_Sqlite_Left Join_Sql Delete - Fatal编程技术网

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

当另一个表中不存在匹配项时,从SQLite表中删除行,sqlite,left-join,sql-delete,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-近左:语法

我需要从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-近左:语法错误。还有其他语法可以使用吗?

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


未测试

由于您使用子查询,因此最好完全取消连接并简化查询:

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

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

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

这将删除第一个表中没有为第二个表中的任何行分配id的所有行。

解释:我使用附加的where条件从主表中删除行,以保留用户标记为锁定的任何行,即在解锁之前不应删除:从主表中删除where id=?和锁定=0;每次成功的删除之后都必须从缓存表中删除一个匹配的行,但SQlite不会返回一个值,让我知道第一个delete语句是否实际匹配任何行。因此,我尝试从缓存表中删除不匹配的行,并在左侧连接处遇到问题。谢谢!在阅读你的答案之前,我已经非常接近这个问题了,除了我使用的是equals而不是IN,所以我的尝试没有达到预期效果。如果main包含数百万行,这不是一个理想的解决方案。最好先执行连接。@Jacob希望有人一开始并没有在sqlite中执行数百万行。如果您的表没有主键,您可以动态地修改一个,例如:从缓存中删除其中的x | |','y不在选择x | |','y FROM main@fluffy,不要低估SQLite:使用它来处理数百万行是完全合理的,但即使只有几千行,这个SELECT id FROM查询也毫无必要地低效且缓慢@winvds答案是一个更好的选择。
DELETE FROM FirstTable WHERE firstTableId NOT IN (SELECT SecondTable.firstTableId FROM SecondTable LEFT JOIN FirstTable ON FirstTable.firstTableId=SecondTable.firstTableId)