SQL技术求助:仅返回仅含'Sampling'的Snum数据
解决仅筛选仅含'Sampling'的Snum问题
方法一:分组后验证所有TestName均为'Sampling'
这种方法通过对Snum分组,验证该分组下的所有TestName都等于'Sampling':
SELECT s.Snum FROM sample s JOIN test t ON s.Snum = t.Snum GROUP BY s.Snum HAVING MAX(t.TestName) = 'Sampling' AND MIN(t.TestName) = 'Sampling';
如果要兼容TestName可能为空的场景,可以改用以下写法:
SELECT s.Snum FROM sample s JOIN test t ON s.Snum = t.Snum GROUP BY s.Snum HAVING COUNT(DISTINCT CASE WHEN t.TestName != 'Sampling' THEN 1 END) = 0;
方法二:排除存在其他TestName的Snum
先找出所有包含非'Sampling' TestName的Snum,再从结果中排除这些值:
SELECT DISTINCT s.Snum FROM sample s JOIN test t ON s.Snum = t.Snum WHERE t.TestName = 'Sampling' AND s.Snum NOT IN ( SELECT Snum FROM test WHERE TestName != 'Sampling' );
原代码的问题分析
你的SQL无法得到预期结果的原因:
- 提前用
WHERE t.ANALYSIS = 'Sampling'过滤了数据,导致无法判断该Snum下是否存在其他TestName; GROUP BY的粒度错误,包含了s.TEXT_ID、s.SAMPLE_NUMBER、t.TEST_NUMBER等字段,分组后不是按Snum整体统计,而是按更细的维度分组,count(t.TestName) = 1仅表示当前小分组内的记录数为1,而非该Snum下只有'Sampling'这一种TestName。
内容的提问来源于stack exchange,提问作者hg05
相关产品推荐
相关产品推荐

