You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL需求:筛选Type为Op且Code仅关联Op的记录

搞定这个需求其实很清晰,我们要留的是Type为'Op'的记录,但得确保同一个用户(Name)和同一个Code的组合里,没有Type为'Com'的记录。给你两种常用的实现方式:

方法1:用NOT EXISTS子查询(最直观)

SELECT t1.*
FROM your_table t1
WHERE t1.Type = 'Op'
AND NOT EXISTS (
    -- 检查当前Name+Code组合是否存在Com类型的记录
    SELECT 1
    FROM your_table t2
    WHERE t2.Name = t1.Name
      AND t2.Code = t1.Code
      AND t2.Type = 'Com'
);

逻辑解释:

  • 先在外层把所有Type='Op'的记录捞出来
  • 对每条Op记录,子查询去查同一个用户同一个Code下有没有Com的记录
  • 如果查不到(也就是NOT EXISTS为真),就把这条Op记录留下来

方法2:用分组筛选+关联查询

如果偏好先筛选出合法的Name+Code组合再查数据,可以用CTE来实现:

WITH valid_name_code AS (
    SELECT Name, Code
    FROM your_table
    GROUP BY Name, Code
    -- 确保这个组合下只有Op类型的记录
    HAVING COUNT(DISTINCT Type) = 1 AND MAX(Type) = 'Op'
)
SELECT t.*
FROM your_table t
JOIN valid_name_code vnc 
  ON t.Name = vnc.Name AND t.Code = vnc.Code
WHERE t.Type = 'Op';

逻辑解释:

  1. 先通过CTE找出所有Name+Code组合里,只存在Type='Op'的条目(分组后不同Type的数量是1,且这个Type是Op)
  2. 再把原表和这个合法组合表关联,筛选出Op类型的记录就行

这两种方法跑你的示例数据,都能得到你想要的结果。如果数据库里数据量比较大,给Name和Code加个联合索引,能让查询速度更快。

内容的提问来源于stack exchange,提问作者john

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:20:37