2014-09-26 134 views
4

我試圖獲得CASE_ID的名單,其中使用Microsoft SQL Server 2012GROUP BY列不具有特定值

例如情況不包含特定的角色ID,我想獲得CASE_ID的集合不包含的4

從數據集下面的查詢將排除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 

到目前爲止,我已經嘗試

所以一個角色ID以下

SELECT Case_Id 
FROM [dbo].[caseRole] cr 
WHERE cr.RoleId!=4 
GROUP BY Case_Id ORDER BY Case_Id 
+1

不要你的意思'cr.roleId <> 4' ? – epoch 2014-09-26 13:38:15

回答

11

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); 
+0

太棒了 - 我嘗試了這條路線,但我的大腦並沒有接受它...無論如何,我已經測試過,效果很棒。非常感謝您的時間,將接受。 – Phil 2014-09-26 13:42:48

+0

我不知道這個比戈登快。 – potashin 2015-06-13 08:17:14

6

只需添加一個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; 
+0

享受這個變體 - 儘管簡單一些,做了一些類似的SUM,但卻讓我想起了它。我認爲Mureinik的回答由於語義學而更加自我解釋。然而,將投票。 – Phil 2014-09-26 13:47:42

+2

@菲爾。 。 。知道哪些數據具有更好的性能會很有趣。有時候穆里尼克會這樣做,有時候會這樣。 – 2014-09-26 19:05:00