如何在删除指定记录时返回子查询结果及已使用记录数
嘿,我来帮你搞定这个需求!咱们的目标很明确:只有当csv_files表中不存在used=True的记录时,删除对应相关记录,同时返回used=True的记录总数。结合你提到的CTE(WITH语句)写法,我给你两种场景的实现方案,看哪种更贴合你的实际需求:
场景1:按filename分组,仅当某filename下无used='t'记录时删除该filename的所有记录
如果你的需求是针对单个filename——比如某个filename下所有记录的used都不是't',就删除这个filename的全部记录,同时返回全表used='t'的总数,用下面的SQL:
WITH used_counts AS ( -- 先统计全表中used='t'的记录总数,用于最后返回 SELECT COUNT(*) AS true_count FROM csv_files WHERE used = 't' ), delete_candidates AS ( -- 找出所有没有used='t'记录的filename SELECT filename FROM csv_files GROUP BY filename HAVING SUM(CASE WHEN used = 't' THEN 1 ELSE 0 END) = 0 ) -- 只删除符合条件的filename的所有记录,同时返回统计的true_count DELETE FROM csv_files WHERE filename IN (SELECT filename FROM delete_candidates) RETURNING (SELECT true_count FROM used_counts);
逻辑解释:
used_countsCTE:提前统计全表中used='t'的记录数,不管删不删除,最后都要返回这个数值。delete_candidatesCTE:通过分组筛选出那些没有任何used='t'记录的filename。- DELETE语句:只删除属于
delete_candidates的filename的所有记录,并用RETURNING子句返回之前统计的true_count。
场景2:整个表无used='t'记录时,删除表中所有记录
如果你的需求是只有当全表都没有used='t'的记录时,才删除所有记录,那SQL可以更简洁:
WITH used_counts AS ( SELECT COUNT(*) AS true_count FROM csv_files WHERE used = 't' ) -- 只有当true_count为0时才执行删除,同时返回true_count DELETE FROM csv_files WHERE (SELECT true_count FROM used_counts) = 0 RETURNING (SELECT true_count FROM used_counts);
注意事项:
- 如果你表中的
used字段是布尔类型(比如PostgreSQL的boolean),把代码里的't'替换成TRUE即可。 - 主流数据库(MySQL 8.0+、PostgreSQL、SQL Server等)都支持这种CTE写法,老版本数据库可能需要调整语法,但核心逻辑一致。
内容的提问来源于stack exchange,提问作者coder_bro
相关产品推荐
相关产品推荐

