0

我有一个带有主键 ID 和两列 Order 和 Status 的表。Status 的值可以是“A”、“P”、“S”、“O”或“C”中的任何一个。我需要找到状态仅为“A”或“C”的订单值。我应该如何编写一个 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
4

2 回答 2

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示例

顺便说一句,Order这不是列的最佳名称,请避免使用关键字作为列名

于 2013-08-10T07:38:38.780 回答
4

对于许多 SQL 数据库,使用EXCEPT(在 Oracle 中MINUS)相当简单

SELECT [Order] FROM Table1
EXCEPT
SELECT [Order] FROM Table1 WHERE Status NOT IN ('A','C')

一个 SQLfiddle

在 MySQL 中(特别是没有MINUS),您将不得不选择更经典的;

SELECT DISTINCT `Order` FROM Table1 WHERE `Order` NOT IN 
    (SELECT `Order` FROM Table1 WHERE `Status` NOT IN ('A','C'))
于 2013-08-10T07:46:48.410 回答