SQL - удаление нескольких записей - PullRequest
0 голосов
/ 23 декабря 2018

Я пытался научить себя некоторому базовому SQL, который можно внедрить в приложение, которое я создаю с помощью управления базами данных.

Вскоре после внедрения я понял, что не знаю, как бороться с дубликатами.записей.При просмотре в Интернете кажется, что мне нужно назначить ограничение «Уникальность» для каждого фрагмента данных, который может дублироваться, но я хотел знать, могу ли я подойти к этому по-другому.

В заключение , у меня возникла другая идея для решения этой проблемы, я не уверен, как написать это на SQL или даже если это осуществимая идея.

Я хотел бы, чтобы какой-то внешний вклад помог мне выполнить это или опровергнуть мою идею.

Используя язык дротиков, я могу искать все дублирующиеся записи и сколько дубликатов присутствует.Вот то, что я использую, чтобы получить этот результат:

SELECT `title`, COUNT(*) FROM `Article` GROUP BY `url` HAVING COUNT(*) > 1

И это результат

flutter: [{title: US Stock Market Chalks up Huge Weekly Losses; Bitcoin, DXY Impress, COUNT(*): 2}, {title: What Triggered Ethereum to Rise 66% Within 1 Week? Factors and Trends, COUNT(*): 26}, {title: What’s Next for Crypto Miners?, COUNT(*): 2}]

Могу ли я удалить все повторяющиеся результаты с помощьюсумма, возвращаемая COUNT(*) минус один ?

Это будет означать, что если бы у меня было 26 дубликатов What Triggered Ethereum to Rise 66% Within 1 Week? Factors and Trends, я мог бы удалить число, представленное COUNT(*), то есть 26, но доудаление минус 1 из числа 26, фактически оставив мне один дубликат?(желаемый результат использования вышеупомянутого ограничения «Уникальность»)

Редактировать : Это строка SQL, которую я использую для ввода новой строки данных в мою базу данных.

'INSERT INTO Article(title, description, url, urltoimage, publishedat) VALUES("$title", "$description", "$url", "$urlToImage", "$publishedAt")'

1 Ответ

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

Вы можете удалить все записи в строке 1 на основе URL-адреса - при условии, что столбец URL-адреса должен быть уникальным - если комбинация из более чем просто столбца URL-адреса или другого столбца просто меняет первые два предложения WHERE.- также предполагается, что таблица не является таблицей БЕЗ ROWID.

: -

SELECT count() FROM article WHERE url = 'myurl';
WITH cte AS (
    SELECT rowid AS thisrowid
    FROM article 
    WHERE url = 'myurl'
    ORDER by url
    LIMIT (SELECT count(*)-1  FROM article WHERE url = 'myurl')
)
DELETE FROM article WHERE rowid IN (SELECT thisrowid FROM cte);

При этом используется CTE (выражение общей таблицы (временная таблица)) для извлечения rowid (специальный обычно скрытый столбец, который всегда существует, если не указан БЕЗ ROWID) из всей строки 1 строки таблицы article в соответствии с критериями выбора (предложение WHERE) (в данном случае, гдестолбец url содержит myurl).То есть используется LIMIT, и это число строк в соответствии с тем же предложением WHERE, меньше 1.

Этот CTE, список строк, затем используется в качестве основы для предложения WHERE DELETE.

Рабочий пример SQL

Выше было проверено с использованием следующего SQL: -

DROP TABLE IF EXISTS article;
CREATE TABLE IF NOT EXISTS article (title TEXT, description TEXT, url TEXT, urltoimage TEXT, publisheddat);
INSERT INTO article VALUES
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01')
;
SELECT count() FROM article WHERE url = 'myurl';
WITH cte AS (
    SELECT rowid
    FROM article 
    WHERE url = 'myurl'
    ORDER by url
    LIMIT (SELECT count(*)-1  FROM article WHERE url = 'myurl')
)
-- SELECT * FROM cte;
DELETE FROM article WHERE rowid IN (SELECT * FROM cte);
SELECT count() FROM article WHERE url = 'myurl';

Результатами двух запросов являются: -

Количество строк передудаление: -

enter image description here

количество оставшихся строк: -

enter image description here


Альтернатива, более простая и исправляющая проблему, повторяющаяся

Говоря, что, вероятно, было бы так же просто

  1. создать новую таблицу, например таблицу article_new, включающую ограничение UNIQUE, но в противном случаеидентичные и
  2. затем заполняют это из существующей таблицы (используя INSERT OR IGNORE, чтобы не дать сбой при удалении дубликатов).
  3. затем переименуйте исходную таблицу (можно удалить ее, но безопаснее этого не делать), например, в article_old
  4. , затем переименуйте новую таблицу в исходное имя таблицы
  5. , наконец, отбросьте переименованный (если вы счастливы сделать это).

Код мог бы быть (опять-таки, предполагая, что столбец url должен быть уникальным): -

DROP TABLE IF EXISTS article_new;
DROP TABLE IF EXISTS article_old;
CREATE TABLE IF NOT EXISTS article_new (title TEXT, description TEXT, url TEXT UNIQUE, urltoimage TEXT, publisheddat);
INSERT OR IGNORE INTO article_new SELECT * FROM article;
ALTER TABLE article RENAME TO article_old;
ALTER TABLE article_new RENAME TO article;
DROP TABLE IF EXISTS article_old;

Рабочий пример (обратите внимание, больше строк добавлено с 3различные столбцы URL): -

DROP TABLE IF EXISTS article;
CREATE TABLE IF NOT EXISTS article (title TEXT, description TEXT, url TEXT, urltoimage TEXT, publisheddat);
INSERT INTO article VALUES
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl2','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl3','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl3','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl3','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl3','myimageurl','2018-01-01'),
    ('Title001','Description001','myurl3','myimageurl','2018-01-01')
;

DROP TABLE IF EXISTS article_new;
DROP TABLE IF EXISTS article_old;
CREATE TABLE IF NOT EXISTS article_new (title TEXT, description TEXT, url TEXT UNIQUE, urltoimage TEXT, publisheddat);
INSERT OR IGNORE INTO article_new SELECT * FROM article;
ALTER TABLE article RENAME TO article_old;
ALTER TABLE article_new RENAME TO article;
DROP TABLE IF EXISTS article_old;
SELECT * FROM article;

Результат: -

enter image description here

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