sql - 在多个查询上使用 "with"语句?

标签 sql postgresql

我正在尝试从我的表中删除重复的行,例如,如果我的客户表包含以下内容:

first_name    last_name    email 
fred          wilford      wilford@xchange.co.uk
fred          wilford      wilford@xchange.co.uk
Damian        Jones        jones@xchange.co.uk

理想的结果应该是这样的:

first_name    last_name    email 
fred          wilford      wilford@xchange.co.uk
Damian        Jones        jones@xchange.co.uk

在删除主表中的重复行之前,对于创建的包含重复行的中间表来说,这应该是相当简单的,最后将中间表中的所有行插入回主表。但是我更愿意删除中间表并只使用类似 with 语句的东西。 考虑以下示例:

with dups as 
(
    select name,last_name,email from customer group by 1,2,3 having  
    count(*) > 1 
)
delete from customer
using
(
    select name,last_name,email from customer group by 1,2,3 having     
    count(*) > 1 
)b
where b.name = customer.name;
insert into customer
(
    select name,last_name,email from dups
)

问题是最后的插入语句失败了,因为“dups”没有被识别。有没有办法来解决这个问题?提前致谢

最佳答案

您可以 chain the CTE如果你想:

WITH dups AS
(
    select name,last_name,email from customer group by 1,2,3 having  
    count(*) > 1 
),
del AS(
    DELETE FROM customer USING dups WHERE dups.name = customer.name RETURNING dups.*
),
ins AS(
    INSERT INTO customer(name,last_name,email) SELECT name,last_name,email FROM del RETURNING del.*
)
SELECT * FROM ins;

关于sql - 在多个查询上使用 "with"语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499508/

相关文章:

mysql - R 中指向数据库的类似指针的变量

mysql - 从关系表中删除不需要的行

postgresql - 列出所有事件(即尚未提交)事务的事务时间戳(transaction_timestamp())

postgresql - uuid 列如何在 ORDER BY 中排序?

postgresql - 如何将公共(public)模式恢复为不同的模式

sql - 空间优化查询运行速度比预期慢

mysql - sql连接不在选择中

php - MySQL总结关系数据库中的数字

sql - 使用 dblink 在连接信息字符串中缺少某些内容

postgresql - SequelizeJS : How to know success or failure when executing an INSERT raw query?