请教以下SQL语句的功能:DELETE t1 FROM [table] t1 WHERE (...)>0
拆解这段SQL的功能
先把你贴的代码放出来方便分析:
delete t1 from [table] t1 where ( select [c] from [table] t2 where t1.[c] <> t2.[c] ) > 0
这段是个写得有点“绕”的自关联删除语句,我们一步步拆逻辑:
- 外层的
delete t1 from [table] t1:明确是要从[table]表(别名叫t1)里删除行 - 内层子查询
select [c] from [table] t2 where t1.[c] <> t2.[c]:拿当前要判断的t1行的c字段,和表中所有其他行(t2)的c字段对比,找出所有和它不一样的行,返回这些行的c值 - 最后的
> 0:这里是SQL的隐式转换在起作用——如果子查询能返回至少1行结果,就会被当成布尔值true(对应数值1),满足>0的条件;如果子查询啥都没返回,就会被当成false(对应数值0),不满足条件
最终功能总结
简单说,这段SQL的作用是:
只要表中存在至少两个不同的
c字段值,就会把表中所有行都删掉;只有当表中所有行的c值完全一模一样时,才不会删除任何数据。
优化写法建议
其实这段代码的逻辑很不直观,实际工作中我们会用更清晰的写法实现同样的效果,比如用EXISTS(可读性更好):
DELETE FROM [table] WHERE EXISTS ( SELECT 1 FROM [table] t2 WHERE t2.[c] <> [table].[c] )
或者先判断是否存在不同值再删除,效率可能更高:
DELETE FROM [table] WHERE (SELECT COUNT(DISTINCT [c]) FROM [table]) > 1
内容的提问来源于stack exchange,提问作者Matthew May
相关产品推荐
相关产品推荐

