从数据库中的每个表中删除重复项

问题描述 投票:0回答:2

我有一个包含多个表的数据库。这些表具有相同的结构,其中有一列称为

date
和一堆包含各种数据的其他列。

我可以从单个表中删除重复项,如下所示:

DELETE FROM table1
WHERE EXISTS (
    SELECT 1 FROM table1 p2
    WHERE table1.date = p2.date
    AND table1.ROWID > p2.ROWID
)

我大约有

30 tables
需要定期清洁。虽然我可以为每个表运行上面的代码,但在获取数据库中的表列表后,有没有办法通过
for loop
来执行此操作:

SELECT name FROM sqlite_master WHERE type='table'
sqlite sql-delete
2个回答
1
投票

您可以使用

PL/SQL block
来实现此目的,

请尝试使用此脚本:

DO $$ 
DECLARE
    table_name text;
BEGIN
    -- Loop through the list of table names
    FOR table_name IN (SELECT name FROM sqlite_master WHERE type='table') LOOP
        -- Generate and execute the DELETE statement for each table
        EXECUTE 'DELETE FROM ' || table_name || ' WHERE EXISTS (
            SELECT 1 FROM ' || table_name || ' p2
            WHERE ' || table_name || '.date = p2.date
            AND ' || table_name || '.ROWID > p2.ROWID
        )';
    END LOOP;
END $$;

此块将为每个表执行

DELETE
语句,
removing duplicates
基于指定的条件。

*确保在您的 SQLite 环境中执行此代码


1
投票

这是一个为每个表生成并运行单独的 DELETE 语句的脚本: --> 循环遍历表列表并从每个表中删除重复项

BEGIN;
 FOR table_name IN (SELECT * FROM table_list) DO
   EXECUTE IMMEDIATE 'DELETE FROM ' || table_name.name || ' WHERE ROWID NOT IN (
     SELECT MAX(ROWID) FROM ' || table_name.name || ' GROUP BY date
   )';
 END FOR;
COMMIT;
© www.soinside.com 2019 - 2024. All rights reserved.