如何查询对应Answer字段全为NULL的重复URL记录?
需求分析与SQL修正方案
咱们先明确需求和现有问题:
- 你有一张结构为 URL | Answer 的数据表,示例数据如下:
- google | NULL
- google | NULL
- google | NULL
- yahoo | Yes
- hotmail | NULL
- hotmail | No
- 你的目标是:筛选出所有Answer字段全为NULL的URL(比如google),同时排除那些存在非NULL Answer值的URL(比如hotmail,因为它有一条Answer是No)
原SQL的问题
你写的这条SQL:
SELECT DISTINCT URL FROM Table WHERE URL IN ( SELECT URL FROM Table WHERE Answer IS NULL GROUP BY URL HAVING Count(*) >= 1 );
没法满足需求。它的逻辑是找出「存在至少一条Answer为NULL的URL」,但完全没排除那些同时有非NULL Answer的URL——比如hotmail会被错误地选出来,因为它确实有两条Answer为NULL的记录,但它不符合“全部Answer都是NULL”的要求。
几种正确的写法
这里给你推荐几种简洁且准确的实现方式:
方式1:用NOT EXISTS(逻辑最直观)
SELECT DISTINCT URL FROM YourTable t1 WHERE NOT EXISTS ( SELECT 1 FROM YourTable t2 WHERE t2.URL = t1.URL AND t2.Answer IS NOT NULL );
逻辑解释:找所有URL,不存在任何一条该URL对应的Answer非空的记录,完全匹配你的需求。
方式2:用GROUP BY + HAVING(最简洁)
SELECT URL FROM YourTable GROUP BY URL HAVING COUNT(Answer) = 0;
小技巧:COUNT(Answer)只会统计非NULL的Answer数量,当这个值为0时,说明该URL的所有Answer都是NULL,完美命中要求。
方式3:用LEFT JOIN(另一种逻辑思路)
SELECT DISTINCT t1.URL FROM YourTable t1 LEFT JOIN YourTable t2 ON t1.URL = t2.URL AND t2.Answer IS NOT NULL WHERE t2.URL IS NULL;
逻辑解释:把原表和包含非NULL Answer的记录左连接,最后只保留那些没有匹配到的URL,也就是没有非NULL Answer的URL。
内容的提问来源于stack exchange,提问作者Bebo Santana
相关产品推荐
相关产品推荐

