SQLite:尝试使用别名删除时出错
在SQLite我的查询中:SQLite:尝试使用别名删除时出错,sql,sqlite,Sql,Sqlite,在SQLite我的查询中: DELETE FROM notification_invoice t1 WHERE notificationDate >= 1536883200000 and providerId in ("1234","5678") AND EXISTS ( SELECT 1 FROM notification_invoice t2 WHERE providerId in ("1234","5678")
DELETE FROM notification_invoice t1 WHERE notificationDate >= 1536883200000 and providerId in ("1234","5678")
AND EXISTS (
SELECT 1 FROM notification_invoice t2 WHERE
providerId in ("1234","5678")
and t2.notificationDate = t1.notificationDate
and t1.ownerKey = t2.ownerKey
AND t1._id < t2._id
)
DELETE语句在单个表上运行,不能使用表别名。别名导致了您的错误
请参阅以了解类似情况 DELETE语句在单个表上运行,不能使用表别名。别名导致了您的错误
请参阅以了解类似情况 删除要从中删除的表上的别名将修复语法错误
DELETE FROM notification_invoice
WHERE notificationDate >= 1536883200000
AND providerId in ("1234","5678")
AND EXISTS (
SELECT 1
FROM notification_invoice t2
WHERE t2.providerId in ("1234","5678")
AND t2.notificationDate = notification_invoice.notificationDate
AND t2.ownerKey = notification_invoice.ownerKey
AND t2._id > notification_invoice._id
)
由于您没有描述要实现的数据或索引逻辑,因此无法判断逻辑是否正确
子查询可能应该有t2.providerId=notification\u invoice.provider\u id。在不知道数据、约束、预期逻辑等的情况下,我们无法判断。删除要删除的表上的别名将修复语法错误
DELETE FROM notification_invoice
WHERE notificationDate >= 1536883200000
AND providerId in ("1234","5678")
AND EXISTS (
SELECT 1
FROM notification_invoice t2
WHERE t2.providerId in ("1234","5678")
AND t2.notificationDate = notification_invoice.notificationDate
AND t2.ownerKey = notification_invoice.ownerKey
AND t2._id > notification_invoice._id
)
由于您没有描述要实现的数据或索引逻辑,因此无法判断逻辑是否正确
可能子查询应该有t2.providerId=notification\u invoice.provider\u id。在不知道数据、约束、预期逻辑等的情况下,我们无法判断。Sqlite确实支持带DELETE的表别名,您只是使用了错误的语法。在表名和别名之间需要使用AS:
sqlite> CREATE TABLE foo(bar);
sqlite> INSERT INTO foo VALUES ('dog');
sqlite> SELECT * FROM foo;
bar
----------
dog
sqlite> DELETE FROM foo AS f WHERE f.bar = 'dog';
sqlite> SELECT * FROM foo;
sqlite>
如果您查看中的语法图,特别是限定表名,您将看到AS不像在SELECT表名中那样是可选的。Sqlite确实支持带DELETE的表别名,您只是使用了错误的语法。在表名和别名之间需要使用AS:
sqlite> CREATE TABLE foo(bar);
sqlite> INSERT INTO foo VALUES ('dog');
sqlite> SELECT * FROM foo;
bar
----------
dog
sqlite> DELETE FROM foo AS f WHERE f.bar = 'dog';
sqlite> SELECT * FROM foo;
sqlite>
如果查看中的语法图,特别是限定表名,您将看到AS与SELECT表名中的AS不同,它不是可选的。如果删除EXISTS条件,是否仍会出现错误?@jarlh yes,get same errorNow删除完整的WHERE子句。保持从通知中删除发票t1。有错误吗?注意,如果有效,您将删除所有数据,切勿在生产数据库上尝试此操作!从通知发票t1中删除从通知发票t2中选择1,其中….-获取相同的错误。如果删除EXISTS条件,是否仍会获取错误?@jarlh yes,获取相同的错误现在删除complete WHERE子句。保持从通知中删除发票t1。有错误吗?注意,如果有效,您将删除所有数据,切勿在生产数据库上尝试此操作!从通知发票t1中删除从通知发票t2中选择1,其中….-得到相同的错误。如果我没有使用别名t1-没有错误。但是查询返回的结果不正确。@Alexei-如果你对我们大喊大叫,你真的认为我们会帮助你吗!?!?!??!?!太好了,听起来你的问题得到了回答。错误的结果很可能是由于WHERE子句和EXISTS条件中的某些逻辑错误造成的。你必须自己解决这个问题。如果我不使用别名t1-没有错误。但是查询返回的结果不正确。@Alexei-如果你对我们大喊大叫,你真的认为我们会帮助你吗!?!?!??!?!太好了,听起来你的问题得到了回答。错误的结果很可能是由于WHERE子句和EXISTS条件中的某些逻辑错误造成的。您必须自己解决这个问题。无帮助:从通知中删除发票作为t1,其中通知日期…-错误:[SQLITE_Error]SQL错误或删除附近缺少数据库:语法错误SQLState:null错误代码:1@Alexei您使用的是哪个版本的sqlite?sqlite-jdbc-3.8.10.1。jar@Alexei这已经很旧了。这是最新版本吗:3.25.2?没有帮助:从通知中删除发票作为t1,其中通知日期…-错误:[SQLITE_Error]SQL错误或删除附近缺少数据库:语法错误SQLState:null错误代码:1@Alexei您使用的是哪个版本的sqlite?sqlite-jdbc-3.8.10.1。jar@Alexei这已经很旧了。这是最新版本吗:3.25.2?