如何选择不包含特定值但必须具有特定值的组

时间:2016-03-14 15:44:03

标签: sql

我有表订单

ID  |  State  | 
===================
1   |     A   |   
1   |     B   |  
1   |     C   |   
1   |     D   |  
1   |     E   |    
2   |     A   |  
2   |     B   |   
2   |     E   |  
3   |     A   |  
3   |     B   |   
3   |     E   |  
4   |     A   |   
4   |     B   |  
4   |     C   |  
4   |     D   |   

从我喜欢的地方选择必须具有状态值B和E且必须没有状态值C和D的ID组。

从上表中 - 正确的结果应该是id 2和3

谢谢,

5 个答案:

答案 0 :(得分:0)

SELECT * 来自订单 状态IN(' B',' E')

那就是它。您说明价值的事实只能是' B'或者' E'意味着您已经排除了C' C' C'或者' D'或其他任何事情。

答案 1 :(得分:0)

希望这会有所帮助:

SELECT id FROM ORDER
    WHERE STATE = E AND STATE = B

答案 2 :(得分:0)

您可以使用set运算符:EXCEPT

SELECT ID FROM Order WHERE State IN ('B','E')
EXCEPT
SELECT ID FROM Order WHERE State IN ('C','D')

答案 3 :(得分:0)

以下内容应该有效(使用窗口函数或根据dbms中可用的特定功能,可能有更好的替代方法)

SELECT ID FROM
(
    SELECT 
        ID, 

        CASE STATE
            WHEN 'B' THEN 'Y'
            ELSE 'N'
        END AS HasB,

        CASE STATE
            WHEN 'E' THEN 'Y'
            ELSE 'N'
        END AS HasE,

        CASE STATE
            WHEN 'C' THEN 'Y'
            ELSE 'N'
        END AS HasC,

        CASE STATE
            WHEN 'D' THEN 'Y'
            ELSE 'N'
        END AS HasD

    FROM TABLE
)
GROUP BY ID
HAVING MAX(HasB) = 'Y' AND MAX(HasE) = 'Y' AND MAX(HasC) = 'N' AND MAX(HasD) = 'N'

答案 4 :(得分:0)

一种简单的方法是使用聚合和having子句:

select id
from t
where sum(case when state = 'B' then 1 else 0 end) > 0 and
      sum(case when state = 'E' then 1 else 0 end) > 0 and
      sum(case when state = 'C' then 1 else 0 end) = 0 and
      sum(case when state = 'D' then 1 else 0 end) = 0;

having子句中的每个条件都计算给定值存在的次数。 = 0表示没有匹配,> 0表示至少有一个匹配。