根据单个值排除整个组

AS9*_*S91 5 sql sql-server select group-by sql-server-2012

药片

CID Code
1    A
1    B
1    C
2    C
2    A
2    B
3    A
3    D
Run Code Online (Sandbox Code Playgroud)

我希望输出只有那些 CID 组 Code <> 'C'

期望输出:

CID  Code
3     A
3     D
Run Code Online (Sandbox Code Playgroud)

查询尝试:

SELECT DISTINCT
         CID
        ,Code
FROM Table T
WHERE Code <> 'C'
Run Code Online (Sandbox Code Playgroud)

但这将排除代码 = C 的行,而不是代码 = C 的整个组。不知道如何GROUP BY在这里工作

Gor*_*off 5

一种方法使用not exists

select distinct cid, code
from t
where not exists (select 1
                  from t t2
                  where t2.cid = t.cid and t2.code = 'C'
                 );
Run Code Online (Sandbox Code Playgroud)

另一种方法使用窗口函数:

select distinct cid, code
from (select t.*,
             sum(case when t.code = 'C' then 1 else 0 end) over (partition by cid) as numCs
      from t
     ) t
where numCs = 0;
Run Code Online (Sandbox Code Playgroud)


Vla*_*nov 5

另一种变体,它产生与带有以下内容的执行计划相同的执行计划NOT EXISTS

SELECT T.CID, T.Code
FROM T
WHERE
    T.CID NOT IN
    (
        SELECT T2.CID
        FROM T AS T2
        WHERE T2.Code = 'C'
    )
;
Run Code Online (Sandbox Code Playgroud)

内部查询给出了至少有一个 的所有 CID 组的列表C。主查询返回所有其他组中不包含在内部列表中的所有行。

我不明白你为什么要提出DISTINCT这个问题。如果数据没有重复项,DISTINCT则会进行额外的排序,但没有任何用处,因为已经没有重复项了。如果数据有重复项 - 您真的想删除它们吗?