You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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'
    );

解释:

  • 外层查询先关联DUTTestResults表,筛选出指定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

火山引擎 最新活动