SQL Server中如何筛选IO列无'o'的Serial行?
刚好碰到过类似的筛选需求,在SQL Server里有几种实用的实现方法,我给你逐一说明:
方法一:使用NOT EXISTS子查询(最直观的逻辑)
这种方式直接针对每条记录,检查对应的Serial是否存在'o'的记录,不存在就保留当前行:
SELECT s.Serial, s.IO FROM YourTableName s WHERE NOT EXISTS ( SELECT 1 FROM YourTableName WHERE Serial = s.Serial AND IO = 'o' );
说明:记得把YourTableName替换成你实际的数据表名称,子查询的作用是验证当前Serial有没有'o'的记录,没有的话就会保留原表中的该行。
方法二:使用GROUP BY + HAVING分组筛选
先按Serial分组,过滤掉包含'o'的分组,再关联原表获取具体的记录行:
SELECT s.Serial, s.IO FROM YourTableName s INNER JOIN ( SELECT Serial FROM YourTableName GROUP BY Serial HAVING COUNT(CASE WHEN IO = 'o' THEN 1 END) = 0 ) filtered_serials ON s.Serial = filtered_serials.Serial;
说明:分组后的HAVING子句会统计每个Serial中IO='o'的数量,等于0就代表这个Serial没有任何'o'的记录,之后关联原表就能拿到所有符合条件的行。
方法三:使用EXCEPT运算符排除不符合的Serial
先获取所有Serial,再排除那些存在'o'的Serial,最后用这些合格的Serial筛选原表:
SELECT s.Serial, s.IO FROM YourTableName s WHERE s.Serial IN ( SELECT Serial FROM YourTableName EXCEPT SELECT Serial FROM YourTableName WHERE IO = 'o' );
说明:EXCEPT会返回仅在第一个结果集存在的Serial(也就是没有'o'记录的Serial),再用这个集合去筛选原表的行即可。
这几种方法都能得到你想要的结果,其中NOT EXISTS在大多数情况下性能表现不错,推荐优先尝试哦。
内容的提问来源于stack exchange,提问作者Elham Azadfar
相关产品推荐
相关产品推荐

