SQLite УДАЛИТЬ условие, Firefox History - PullRequest
0 голосов
/ 03 сентября 2018

как удалить результаты этого запроса ?, повторить эти условия, но с УДАЛИТЬ.

этот запрос возвращает последний посещенный сайт, я бы использовал те же условия для удаления истории, необходимо преобразовать синтаксис в "УДАЛИТЬ ИЗ" и использовать те же критерии, пожалуйста, помогите .. спасибо.

SELECT datetime(moz_historyvisits.visit_date/1000000, 'unixepoch') AS 'Date Visited', moz_places.title AS Title, moz_places.url AS URL, moz_places.visit_count AS Count FROM moz_historyvisits, moz_places WHERE moz_historyvisits.place_id = moz_places.id ORDER BY moz_historyvisits.visit_date ASC

или это

SELECT datetime(moz_historyvisits.visit_date/1000000,'unixepoch') as data, moz_places.url
FROM   moz_places, moz_historyvisits 
WHERE  moz_places.id = moz_historyvisits.place_id
ORDER BY 1 desc
LIMIT 21 OFFSET 0;

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы можете использовать 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

Результат 2 -

enter image description here

Результат 3 -

enter image description here

Результат 4 -

enter image description here

Сообщения -

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
0 голосов
/ 03 сентября 2018

Я не уверен, что полностью понял ваш вопрос, но если вы хотите выборочно удалить связанные записи как из moz_places, так и moz_historyvisits, то вы сможете использовать что-то вроде этого:

CREATE TEMPORARY VIEW delenda AS
  SELECT id FROM moz_places WHERE ($condition);

DELETE FROM moz_historyvisits WHERE place_id IN (SELECT id FROM delenda);
DELETE FROM moz_places WHERE id IN (SELECT id FROM delenda);

(замените условие $ вашими критериями для удаления.)

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