按列分组没有特定值

Phi*_*hil 5 sql sql-server select sql-server-2012

我试图获取Case_Id的列表,其中案例不包含使用Microsoft Sql Server 2012的特定RoleId.

例如,我想获得一个不包含RoleId为4的Case_Id集合.

因此,从查询下面的数据集中将排除Case_Id的49,50和53.

    Id      RoleId  Person_Id   Case_Id
   --------------------------------------
    108     4       108         49
    109     1       109         49
    110     4       110         50
    111     1       111         50
    112     1       112         51
    113     2       113         52
    114     1       114         52
    115     7       115         53
    116     4       116         53
    117     3       117         53
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已尝试过以下内容

SELECT Case_Id
FROM [dbo].[caseRole] cr
WHERE cr.RoleId!=4
GROUP BY Case_Id ORDER BY Case_Id
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 13

not exists操作似乎正好满足你的需要:

SELECT DISTINCT Case_Id
FROM   [dbo].[caseRole] cr
WHERE  NOT EXISTS (SELECT *
                   FROM   [dbo].[caseRole] cr_inner
                   WHERE  cr_inner.Case_Id = cr.case_id 
                          AND cr_inner.RoleId = 4);
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 10

只需添加一个having子句而不是where:

SELECT Case_Id
FROM [dbo].[caseRole] cr
GROUP BY Case_Id
HAVING SUM(case when cr.RoleId = 4 then 1 else 0 end) = 0
ORDER BY Case_Id;
Run Code Online (Sandbox Code Playgroud)

  • 测试了这个和 Mureinik 的解决方案。两种逻辑都有效。就我而言,Gordon 方法所花费的时间是 Mureinik 方法的 89%。因此,使用 Gordon 时性能会提高 11%。通过运行查询或通过估计计划的子树成本,可以稳定地重现该数字。如果性能与您无关,那么选择您阅读起来更舒服的一个。对我来说,SUM 的使用是鼓舞人心的。爱它。 (3认同)
  • @Phil...知道哪些数据具有更好的性能会很有趣.有时Mureinik会这样做,有时会这样. (2认同)