我正在尝试编写一个方法,从表中删除重复项,而不必知道表的一般细节(即,它应该在任何表上运行)。
我从这里使用以下方法(最后一种方法)通过psycopg2
:
CREATE TABLE tempTable (LIKE "{table}");
INSERT INTO tempTable(*)
SELECT
DISTINCT ON ("{column}") *
FROM "{table}";
DROP TABLE "{table}";
ALTER TABLE tempTable
RENAME TO "{table}";
DROP table tempTable
问题是您不能使用*来获取INSERT INTO
命令中的所有列。我们期望指定要插入的所有列的列表,这可能有利于控制,但不利于我在这里的目的。
我知道我可以用
获取表的列名列表SELECT column_name FROM information_schema.columns WHERE table_name = "{table}"
但是我不能把它作为*
的子查询。
对这个8年前的问题的回答表明,这在SQL中是不可能的。这可能是真的,也可能不是真的。
现在可以做吗?
你的链接指向MySQL
数据库,在PostgreSQL
是完全有效的使用insert
没有列列表。
INSERT INTO tempTable
SELECT
DISTINCT ON (a) *
FROM t;
不是最佳实践(因为如果列顺序突然不像预期的那样,这可能会导致问题),但是对于使用源表的like
创建目标表的用例来说,这是可行的。
附加两点
您可能需要在select distinct中添加
order by
以启用确定性结果(哪些重复的行将被删除并保留)。最后的
DROP table tempTable
放错了位置,因为这个表不再存在,因为在前面的语句中被重命名为…