我有表订单
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
谢谢,
答案 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
表示至少有一个匹配。