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

q0qdq0h2  于 11个月前  发布在  SQLite
关注(0)|答案(2)|浏览(169)

我有一个包含多个表的数据库,这些表的结构都是一样的,只有一个名为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'

qvsjd97n

qvsjd97n1#

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

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;

字符串

2ic8powd

2ic8powd2#

您可以使用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环境中执行此代码

相关问题