如何编写SQL查询筛选仅关注Data领域的学者(acnum)
如何筛选仅关注Data领域的学者编号?
你原来的SQL语句能成功找出所有关注Data领域的学者,但没法排除那些同时还拥有其他非Data类兴趣的学者。这里有两种实用的修改方案,帮你精准筛选出仅关注Data领域的学者编号:
方案一:使用NOT EXISTS子查询
这种方法的思路是:先找到所有关注Data的学者,再排除掉那些存在其他非Data兴趣的学者。
SELECT acnum FROM interest WHERE UPPER(descrip) LIKE '%DATA%' AND NOT EXISTS ( SELECT 1 FROM interest i2 WHERE i2.acnum = interest.acnum AND UPPER(i2.descrip) NOT LIKE '%DATA%' );
逻辑说明:
- 外层查询先筛选出所有包含Data兴趣的学者编号;
- 内层子查询检查同一个学者是否存在非Data的兴趣,如果存在,就把这个学者从结果中排除;
- 最终剩下的就是只关注Data领域的学者。
方案二:使用分组+HAVING子句
这种方法通过分组统计,直接判断某个学者的所有兴趣是否都属于Data领域:
SELECT acnum FROM interest GROUP BY acnum HAVING COUNT(CASE WHEN UPPER(descrip) NOT LIKE '%DATA%' THEN 1 END) = 0 AND COUNT(CASE WHEN UPPER(descrip) LIKE '%DATA%' THEN 1 END) > 0;
逻辑说明:
- 按学者编号
acnum分组; - 第一个
COUNT统计该学者非Data兴趣的数量,要求这个数量为0(即没有其他兴趣); - 第二个
COUNT确保该学者至少有一条Data相关的兴趣记录(避免误选没有任何兴趣的学者)。
内容的提问来源于stack exchange,提问作者user24529
相关产品推荐
相关产品推荐

