SQL Server CE 3.5:查询重复Naam且Bijzonderheden为空的语句问题
SQL Server Compact Edition 3.5 查询重复Naam且Bijzonderheden为空的记录
核心查询语句
要获取表zeeboot中Naam列存在重复,且当前记录的Bijzonderheden为空或NULL的所有记录,可使用以下语句:
SELECT z.* FROM zeeboot z INNER JOIN ( -- 先找出所有重复出现的Naam(出现次数>1) SELECT Naam FROM zeeboot GROUP BY Naam HAVING COUNT(*) > 1 ) dup ON z.Naam = dup.Naam -- 筛选出这些重复Naam中,Bijzonderheden为空或NULL的记录 WHERE z.Bijzonderheden IS NULL OR z.Bijzonderheden = ''
原查询不符合预期的常见原因
如果之前直接在主查询的WHERE中加入Bijzonderheden过滤条件,再通过GROUP BY判断重复,会导致逻辑错误:
-- 错误示例:仅统计Bijzonderheden为空的记录的重复数,而非整个表中Naam的重复数 SELECT * FROM zeeboot WHERE Bijzonderheden IS NULL OR Bijzonderheden = '' GROUP BY Naam HAVING COUNT(*) > 1
这种写法会遗漏那些Naam在全表重复,但仅部分记录的Bijzonderheden为空的情况,比如某Naam出现3次,其中1次为空、2次不为空,该写法会认为此Naam不重复,从而漏掉符合要求的那条空值记录。
重复Naam对应的Bijzonderheden均不为空的处理
若要查看Naam重复,但所有对应记录的Bijzonderheden都不为空的情况,可使用以下语句:
1. 仅获取符合条件的Naam列表
SELECT Naam FROM zeeboot GROUP BY Naam HAVING COUNT(*) > 1 -- 用CASE判断所有记录的Bijzonderheden是否非空,MIN值为1说明无空值 AND MIN(CASE WHEN Bijzonderheden IS NULL OR Bijzonderheden = '' THEN 0 ELSE 1 END) = 1
2. 获取这些Naam对应的所有记录
SELECT z.* FROM zeeboot z INNER JOIN ( SELECT Naam FROM zeeboot GROUP BY Naam HAVING COUNT(*) > 1 AND MIN(CASE WHEN Bijzonderheden IS NULL OR Bijzonderheden = '' THEN 0 ELSE 1 END) = 1 ) dup ON z.Naam = dup.Naam
内容的提问来源于stack exchange,提问作者Bas H
相关产品推荐
相关产品推荐

