SQLite: получить ошибку при попытке удалить с псевдонимом - PullRequest
0 голосов
/ 03 декабря 2018

В 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") 
         and t2.notificationDate = t1.notificationDate          
         and t1.ownerKey = t2.ownerKey 
         AND t1._id < t2._id
    )    

Но я получаю ошибку:

Error: [SQLITE_ERROR] SQL error or missing database (near "t1": syntax error)
SQLState:  null
ErrorCode: 1

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Удаление использования псевдонима в таблице, из которой удаляется таблица, исправит синтаксическую ошибку.

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_invoice.provider_id.Мы не можем сказать, не зная данных, ограничений, предполагаемой логики и т. Д. И т. Д.

0 голосов
/ 03 декабря 2018

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> 

Если вы посмотрите на синтаксические диаграммы в документации для DELETE , в частности квалифицированную table-name one, вы увидите, что AS не является обязательным, как в SELECT имени таблицы.

0 голосов
/ 03 декабря 2018

Оператор DELETE работает с одной таблицей и не может использовать псевдоним таблицы.Псевдоним вызывает вашу ошибку.

См. stackoverflow.com / a / 15832338/2577062 для аналогичной ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...