SQL关联表过滤:筛选含指定测试记录的指定序列号DUT全量测试结果
解决方案:筛选符合特定测试条件的DUT的所有测试记录
没问题!这是一个很常见的需求,有几种简洁高效的SQL写法可以实现你的目标——仅返回指定SerialNumber对应的DUT的所有测试记录,且前提是该DUT至少存在一条TestName='ABC'且TestResult='123'的测试记录。
方法1:使用EXISTS子查询(推荐,性能更优)
EXISTS是最直观且通常性能最好的方式,它会针对每条DUT记录检查是否存在符合条件的测试条目,一旦找到匹配项就停止检索,适合大数据量场景:
SELECT tr.* FROM TestResults tr INNER JOIN DUT d ON tr.UUTid = d.UUTid WHERE d.SerialNumber = '你要查询的序列号' -- 替换为目标SerialNumber AND EXISTS ( SELECT 1 FROM TestResults tr_check WHERE tr_check.UUTid = d.UUTid AND tr_check.TestName = 'ABC' AND tr_check.TestResult = '123' );
解释:
- 外层查询先关联
DUT和TestResults表,筛选出指定SerialNumber的所有测试记录 EXISTS子查询验证当前DUT是否存在符合条件的测试记录,只有通过验证的记录才会被保留
方法2:使用IN子查询
如果你更习惯子查询返回结果集的写法,可以用IN来先筛选出符合条件的UUTid列表,再进行关联查询:
SELECT tr.* FROM TestResults tr INNER JOIN DUT d ON tr.UUTid = d.UUTid WHERE d.SerialNumber = '你要查询的序列号' -- 替换为目标SerialNumber AND d.UUTid IN ( SELECT UUTid FROM TestResults WHERE TestName = 'ABC' AND TestResult = '123' );
解释:
- 子查询先找出所有拥有
TestName='ABC'且TestResult='123'测试记录的UUTid - 外层查询只保留指定SerialNumber且UUTid在上述列表中的测试记录
方法3:使用JOIN过滤
你也可以通过JOIN一个预筛选的符合条件的UUTid临时表来实现:
SELECT tr.* FROM TestResults tr INNER JOIN DUT d ON tr.UUTid = d.UUTid INNER JOIN ( SELECT DISTINCT UUTid -- 去重避免重复匹配 FROM TestResults WHERE TestName = 'ABC' AND TestResult = '123' ) qualified_uuts ON tr.UUTid = qualified_uuts.UUTid WHERE d.SerialNumber = '你要查询的序列号'; -- 替换为目标SerialNumber
解释:
- 子查询生成一个包含所有符合条件的UUTid的去重列表
- 通过两次INNER JOIN,自动过滤掉不符合条件的DUT及其测试记录
内容的提问来源于stack exchange,提问作者Davide Porro




