SQL按group by分组删除同组QuestionId全为NULL的行
SQL实现方案
直接通过分组筛选出需要整组删除的Id,再执行批量删除即可,不需要用到窗口函数,逻辑简单且兼容性好。
核心写法(适配PostgreSQL、SQL Server等支持同表子查询删除的数据库)
DELETE FROM 你的实际表名 WHERE Id IN ( SELECT Id FROM 你的实际表名 GROUP BY Id HAVING COUNT(QuestionId) = 0 );
逻辑说明
- 子查询按
Id字段分组,通过COUNT(QuestionId)统计每组内非空的QuestionId数量:COUNT(列名)语法会自动忽略值为NULL的记录,因此当同组所有QuestionId都是NULL时,统计结果为0,正好对应需要整组删除的Id。 - 外层语句直接删除所有Id匹配上述筛选结果的行,即可实现“同组全为NULL则删全组,有任意非空值则全组保留”的规则。
MySQL兼容写法
MySQL不支持在DELETE语句中直接查询同表作为删除条件,给子查询套一层临时表别名即可绕开限制:
DELETE FROM 你的实际表名 WHERE Id IN ( SELECT t.Id FROM ( SELECT Id FROM 你的实际表名 GROUP BY Id HAVING COUNT(QuestionId) = 0 ) t );
规则验证
用你给出的示例数据测试:
原始表数据:
Id QuestionId 1 'MyQuestionId' 1 NULL 2 NULL 2 NULL
- Id=1分组内存在非空QuestionId,
COUNT(QuestionId)结果为1,不会被删除,两条记录完整保留 - Id=2分组内所有QuestionId均为NULL,
COUNT(QuestionId)结果为0,对应两条记录会被全部删除
完全匹配你要求的删除规则。
内容的提问来源于stack exchange,提问作者deepo
相关产品推荐
相关产品推荐

