我有一个包含多个表的数据库。这些表具有相同的结构,其中有一列称为
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'
您可以使用
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 环境中执行此代码
这是一个为每个表生成并运行单独的 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;