SQL如何查询指定表中所有行取值均一致的指定列对应值
校验List表nS列全表取值是否一致的SQL实现方案
需求说明
需要校验List表的nS列是否所有行取值都相同,若所有行该列值一致则返回该值,否则无返回结果。
示例1
如下表应当返回'S1',因为所有行的nS列取值均为'S1':
| nS | nE | |:-----|-----:| | 'S1' | 'A1' | | 'S1' | 'A2' | | 'S1' | 'A3' | | 'S1' | 'A4' |
示例2
如下表无返回结果,因为nS列的取值存在差异:
| nS | nE | |:-----|-----:| | 'S1' | 'A1' | | 'S2' | 'A2' | | 'S1' | 'A3' | | 'S3' | 'A4' |
原有代码问题
你编写的SELECT nS FROM List GROUP BY nS HAVING count(nS) = count(*);逻辑不成立:在nS字段没有NULL值的前提下,按nS分组后每组的count(nS)和count(*)永远相等,会返回所有出现过的nS值,完全不符合需求。
正确实现代码
方案1(最简洁,兼容大部分SQL方言)
SELECT MIN(nS) AS nS FROM List HAVING COUNT(DISTINCT nS) = 1;
逻辑说明:统计全表nS的去重后值数量,只有等于1时才返回结果,用MIN/MAX取唯一的nS值即可。
方案2(和原有写法逻辑更接近)
SELECT nS FROM List GROUP BY nS HAVING COUNT(*) = (SELECT COUNT(*) FROM List);
逻辑说明:按nS分组后,某组的行数和全表总行数相等,说明全表所有行的nS都是这个值,直接返回即可。
内容的提问来源于stack exchange,提问作者Night Fall
相关产品推荐
相关产品推荐

