我有一个包含主键ID和两列Order和Status的表。 Status的值可以是'A','P','S','O'或'C'中的任何一个。我需要找到状态仅为“A”或“C”的Order的值。我应该如何编写一个SQL查询呢?我知道一些基本的SQL,但我无法使用它获得我的结果。
样本表:
ID Order Status
1 1234 A
2 2343 P
3 4351 S
4 8675 C
5 9867 A
6 9867 C
7 1234 A
8 2343 A
Expected result:
1234
8675
9867
答案 0 :(得分:4)
select distinct t.[Order]
from Table1 as t
where
not exists
(
select * from
Table1 as t2 where t2.[Order] = t.[Order] and t2.Status not in ('A', 'C')
)
或
select t.[Order]
from Table1 as t
group by t.[Order]
having
sum(case when [Status] in ('A', 'C') then 1 else 0 end) = count(*)
或
select distinct t.[Order]
from Table1 as t
where
t.[Order] not in (select t2.Order from Table1 as t2 where t2.Status not in ('A', 'C'))
有关详细信息,请参阅sql fiddle示例
BTW,Order
不是列的最佳名称,避免在列名中使用关键字
答案 1 :(得分:4)
对于许多SQL数据库,使用EXCEPT
(在Oracle中,MINUS
)
SELECT [Order] FROM Table1
EXCEPT
SELECT [Order] FROM Table1 WHERE Status NOT IN ('A','C')
在MySQL中(特别是没有MINUS
),你将不得不寻找更经典的东西;
SELECT DISTINCT `Order` FROM Table1 WHERE `Order` NOT IN
(SELECT `Order` FROM Table1 WHERE `Status` NOT IN ('A','C'))