Вы можете использовать WITH ..... DELETE
, где ....
- это CTE (выражение общей таблицы), которое соответствует вашему запросу. В качестве альтернативы вы можете использовать запрос как подзапрос предложения WHERE в DELETE.
Однако, все, что вам нужно из запроса, для удаления достаточно данных, чтобы идентифицировать строку, подлежащую удалению. Предполагая, что таблица не является таблицей БЕЗ ROWID , тогда будет достаточно rowid выбранной таблицы.
Таким образом, будет работать следующее: -
Решение 1 (С ..... УДАЛИТЬ)
WITH cte1 AS (SELECT moz_historyvisits.rowid AS rid
FROM moz_places, moz_historyvisits
WHERE moz_places.id = moz_historyvisits.place_id
ORDER BY 1 desc
LIMIT 21 OFFSET 0)
DELETE FROM moz_historyvisits WHERE moz_historyvisits.rowid IN (SELECT rid FROM cte1);
- Обратите внимание, что
datetime(moz_historyvisits.visit_date/1000000,'unixepoch') as data, moz_places.url
не нужны и поэтому были исключены из CTE (они могут быть включены).
Решение 2 УДАЛИТЬ, используя SubQuery в предложении WHERE
В качестве альтернативы вы можете использовать запрос (снова просто извлекая rowid) в качестве подзапроса предложения WHERE, согласно: -
DELETE FROM moz_historyvisits WHERE moz_historyvisits.rowid IN
(SELECT moz_historyvisits.rowid AS rid
FROM moz_places, moz_historyvisits
WHERE moz_places.id = moz_historyvisits.place_id
ORDER BY 1 desc
LIMIT 21 OFFSET 0)
;
Пример кода, используемого для тестирования
Ниже приведен код, использованный для проверки вышеуказанного: -
DROP TABLE IF EXISTS moz_places;
DROP TABLE IF EXISTS moz_historyvisits;
CREATE TABLE IF NOT EXISTS moz_historyvisits (place_id INTEGER, visit_date);
CREATE TABLE IF NOT EXISTS moz_places (id INTEGER PRIMARY KEY, URL TEXT, title TEXT, visit_count INTEGER);
-- Add Some data
INSERT INTO moz_places (URL) VALUES('Rome'),('London'),('Paris'),('Sydney'),('Tokyo');
INSERT INTO moz_historyvisits VALUES(1,'2010-10-11 10:30'),(2,'2018-01-31 12:20'),(1,'2018-02-28 08:15'),(3,'2017-06-01 15:45');
-- Result 1 (show original data)
SELECT * FROM moz_historyvisits JOIN moz_places ON moz_historyvisits.place_id = moz_places.id;
-- Result 2 (test the CTE by selecting everything extracted by the CTE)
WITH cte1 AS (SELECT datetime(moz_historyvisits.visit_date/1000000,'unixepoch') AS data, moz_places.url, moz_places.id, moz_historyvisits.rowid AS rid
FROM moz_places, moz_historyvisits
WHERE moz_places.id = moz_historyvisits.place_id
ORDER BY 1 desc
LIMIT 21 OFFSET 0)
SELECT * FROM cte1;
-- This does deleteion using WITH ..... DELETE
WITH cte1 AS (SELECT moz_historyvisits.rowid AS rid
FROM moz_places, moz_historyvisits
WHERE moz_places.id = moz_historyvisits.place_id
ORDER BY 1 desc
LIMIT 21 OFFSET 0)
DELETE FROM moz_historyvisits WHERE moz_historyvisits.rowid IN (SELECT rid FROM cte1);
-- Result 43show table after deletion
SELECT * FROM moz_historyvisits JOIN moz_places ON moz_historyvisits.place_id = moz_places.id;
-- Do alternative/equivakent deletion via subquery
DELETE FROM moz_historyvisits WHERE moz_historyvisits.rowid IN(SELECT moz_historyvisits.rowid AS rid
FROM moz_places, moz_historyvisits
WHERE moz_places.id = moz_historyvisits.place_id
ORDER BY 1 desc
LIMIT 21 OFFSET 0);
-- Result 4 show table after both deletions
SELECT * FROM moz_historyvisits JOIN moz_places ON moz_historyvisits.place_id = moz_places.id;
Результирующие выходы
Результат 1 -
![![enter image description here](https://i.stack.imgur.com/OWESS.jpg)
Результат 2 -
![enter image description here](https://i.stack.imgur.com/s7s34.jpg)
Результат 3 -
![enter image description here](https://i.stack.imgur.com/lOQsT.jpg)
Результат 4 -
![enter image description here](https://i.stack.imgur.com/IxFSB.jpg)
Сообщения -
DROP TABLE IF EXISTS moz_places
> OK
> Time: 0.356s
DROP TABLE IF EXISTS moz_historyvisits
> OK
> Time: 0.324s
CREATE TABLE IF NOT EXISTS moz_historyvisits (place_id INTEGER, visit_date)
> OK
> Time: 0.358s
CREATE TABLE IF NOT EXISTS moz_places (id INTEGER PRIMARY KEY, URL TEXT, title TEXT, visit_count INTEGER)
> OK
> Time: 0.333s
-- Add Some data
INSERT INTO moz_places (URL) VALUES('Rome'),('London'),('Paris'),('Sydney'),('Tokyo')
> Affected rows: 5
> Time: 0.265s
INSERT INTO moz_historyvisits VALUES(1,'2010-10-11 10:30'),(2,'2018-01-31 12:20'),(1,'2018-02-28 08:15'),(3,'2017-06-01 15:45')
> Affected rows: 4
> Time: 0.354s
-- Result 1 (show original data)
SELECT * FROM moz_historyvisits JOIN moz_places ON moz_historyvisits.place_id = moz_places.id
> OK
> Time: 0s
-- Result 2 (test the CTE by selecting everything extracted by the CTE)
WITH cte1 AS (SELECT datetime(moz_historyvisits.visit_date/1000000,'unixepoch') AS data, moz_places.url, moz_places.id, moz_historyvisits.rowid AS rid
FROM moz_places, moz_historyvisits
WHERE moz_places.id = moz_historyvisits.place_id
ORDER BY 1 desc
LIMIT 21 OFFSET 0)
SELECT * FROM cte1
> OK
> Time: 0s
-- Do alternative/equivakent deletion via subquery
DELETE FROM moz_historyvisits WHERE moz_historyvisits.rowid IN(SELECT moz_historyvisits.rowid AS rid
FROM moz_places, moz_historyvisits
WHERE moz_places.id = moz_historyvisits.place_id
ORDER BY 1 desc
LIMIT 21 OFFSET 0)
> Affected rows: 4
> Time: 0.228s
-- Result 4 show table after both deletions
SELECT * FROM moz_historyvisits JOIN moz_places ON moz_historyvisits.place_id = moz_places.id
> OK
> Time: 0s
-- This does deleteion using WITH ..... DELETE
WITH cte1 AS (SELECT moz_historyvisits.rowid AS rid
FROM moz_places, moz_historyvisits
WHERE moz_places.id = moz_historyvisits.place_id
ORDER BY 1 desc
LIMIT 21 OFFSET 0)
DELETE FROM moz_historyvisits WHERE moz_historyvisits.rowid IN (SELECT rid FROM cte1)
> Affected rows: 0
> Time: 0s
-- Result 43show table after deletion
SELECT * FROM moz_historyvisits JOIN moz_places ON moz_historyvisits.place_id = moz_places.id
> OK
> Time: 0s