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

Sql 如何选择不包含特定值但必须具有特定值的组,sql,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

我要点菜

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   |   
从这里我想选择一组ID,它们必须有状态值B和E,不能有状态值C和D

从上表中可以看出,正确的结果应该具有id 2和id 3

谢谢,

选择* 从命 “B”和“E”中的状态

就这样。您声明的值只能是“B”或“E”,这意味着您已经排除了“C”或“D”的任何值,或者其他任何值。

希望这有助于:

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

您可以使用set运算符:EXCEPT

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

下面的方法应该有效。可能有更好的方法使用窗口功能,或者根据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'

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


having子句中的每个条件统计给定值出现的次数。=0表示没有匹配项,>0表示至少有一个匹配项。

编辑您的问题并提供示例数据和所需结果。例如,state与order有什么关系?谢谢。我是SO的新手,试图添加一个表,但没有通过。谢谢。但是In将提供B或E或两者都有的id。我想要的是一个既有Hb又有Epoe的id,这是错误的。状态不能是E和B。这将永远不会返回一行,甚至不会重新启动!!这正是我想要的。谢谢。不知怎么的,我想念这个小组和哈文·汉克斯。这很有帮助!!
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;