Удалить все строки, которых нет в другой таблице в SQLite - PullRequest
1 голос
/ 06 октября 2010

У меня есть две таблицы (A и B).

Я хочу удалить все строки в таблице B, где B.1 отсутствует в таблице A.2.

Итак, я написал эту формулу в sqlite:

DELETE FROM B 
WHERE 1 
IN 
 (SELECT * 
  FROM B 
  LEFT JOIN A 
  ON A.1=B.2 
  WHERE A.1 
  IS NULL)

Но это возвращает эту ошибку:

only a single result allowed for a SELECT that is part of an expression

Кто-нибудь может мне помочь?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 07 октября 2010

Проблема для вашего примера запроса заключается в том, что предложение IN нельзя использовать вместе с SELECT *, когда SELECT * возвращает более одного столбца. Вам необходимо указать столбец ...

НЕ В

DELETE FROM B
 WHERE B.2 NOT IN (SELECT A.1
                     FROM A)

НЕ СУЩЕСТВУЕТ

DELETE FROM B
 WHERE NOT EXISTS (SELECT NULL
                     FROM A
                    WHERE A.1 = B.2)

SQLite не поддерживает JOINs в операторах DELETE, но вы также можете использовать:

DELETE FROM B
 WHERE B.2 IN (SELECT B.2
                 FROM B
            LEFT JOIN A ON A.1 = B.2
                WHERE A.1 IS NULL)

Вывод:

У меня нет статистики производительности для SQLite, но NOT EXISTS был бы моим выбором, потому что он возвращает true при первом удовлетворении - очень хорошо для работы с дубликатами.

1 голос
/ 06 октября 2010

Я думаю, что у вас есть опечатка где-то в вашем вопросе (может быть, таблица B.2?), Но я думаю, что вы хотите:

DELETE FROM B WHERE NOT EXISTS (SELECT * FROM A WHERE A.1 = B.2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...