编写SQL查询:稍微复杂一点

时间:2013-08-10 07:31:51

标签: sql

我有一个包含主键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

2 个答案:

答案 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')

An SQLfiddle

在MySQL中(特别是没有MINUS),你将不得不寻找更经典的东西;

SELECT DISTINCT `Order` FROM Table1 WHERE `Order` NOT IN 
    (SELECT `Order` FROM Table1 WHERE `Status` NOT IN ('A','C'))