【发布时间】:2020-10-21 00:13:05
【问题描述】:
我有下表:
DROP TABLE IF EXISTS test;
CREATE TABLE test (
id SERIAL,
username varchar(32)
);
INSERT INTO test (username)
VALUES ('Jesse'), ('Jesse'), ('Scott'), ('Scott'), ('John');
当有重复行时,我想删除最低的 ID。我进行了以下查询以查找目标行:
SELECT MIN(id), username
FROM test
GROUP BY username
HAVING count(*) > 1;
当我尝试在 CTE 中使用它时,它最终会删除每一行:
WITH to_delete AS (
SELECT MIN(id), username
FROM test
GROUP BY username
HAVING count(*) > 1
)
DELETE FROM test
WHERE id IN (
SELECT id
FROM to_delete
);
但是,当我运行相同的查询并将 CTE 作为子查询时,它按预期工作:
DELETE FROM test
WHERE id IN (
SELECT MIN(id)
FROM test
GROUP BY username
HAVING count(*) > 1
);
我确信这背后有一些逻辑,但我在搜索中没有找到源代码。为什么 CTE 删除每一行,但子查询按预期工作?
【问题讨论】:
标签: postgresql subquery common-table-expression sql-delete