2013-07-02 167 views
2

我完全停留在如何創建此選擇。我需要從狀態表中只選擇那些order_id的其中沒有身份2.SQL選擇不包括某些狀態的記錄

下面是表:

+----+---------+---------+-- 
| id | order_id| status | 
+----+---------+---------+-- 
| 1 |  1 |  1 | 
| 2 |  1 |  2 | 
| 3 |  2 |  1 | 
| 4 |  2 |  2 | 
| 5 |  3 |  1 | 
| 1 |  3 |  3 | 
| 2 |  4 |  2 | 
| 3 |  4 |  1 | 
| 4 |  4 |  2 | 
| 5 |  5 |  3 | 
+----+---------+----------+-- 

於是,他選擇的結果將是隻order_id = 5

請幫助!

如果要包括與狀態1的訂單,並排除那些狀態3,那麼你可以使用一個類似的想法:

having sum(case when status_id = 1 then 1 else 0 end) > 0 and 
     sum(case when status_id = 3 then 1 else 0 end) = 0 

編輯:我想排除那些ORDER_ID的:
- 它只有狀態1(未狀態2)
- 和
- 其具有狀態3

讓具有表是這樣的:

id--order-id-Prod---Status  
------------------------------ 

1 1  a  1 
6 1  b  2 
7 1  a  2 
8 1  b  1 
9 2  a  1 
10 3  a  1 
11 3  b  1 
12 3  a  2 
13 3  b  2 
14 4  a  1 
15 4  b  1 
16 5  a  1 
17 5  b  1 
18 5  a  2 
19 5  b  2 
20 5  a  3 
21 5  b  3 

選擇應該只顯示ORDER_ID「5」

回答

4

這是一套,內集查詢的例子:

select order_id 
from t 
group by order_id 
having sum(case when status = 2 then 1 else 0 end) = 0 

having條款計算的行爲2的狀態數。 = 0找到沒有匹配的訂單。

編輯:

如果要包括與狀態1的訂單和排除那些與狀態3,那麼你可以使用一個類似的想法:

having sum(case when status_id = 1 then 1 else 0 end) > 0 and 
     sum(case when status_id = 3 then 1 else 0 end) = 0 
+0

這工作正常,但是如果我想排除那些只有狀態1的order_id,並且包含狀態爲3的order_id(如前所述),並且表看起來像這樣。 – user2544102

3

這裏有一種方法。

Select * from TableName 
where Order_ID not in (Select order_ID from tableName where status=2) 

另一種方法是使用not exists子句。

0

我想這樣的作品,一個查詢來選擇所有的ID,一個得到那些爲2的狀態和左側的接合部上ORDER_ID並用2

狀態採摘那些空ORDER_ID訂單列表
select 
    all_ids.order_id 
from 
(
    select distinct 
    order_id 
    from status 
) all_ids 
left join 
(
    select 
    order_id 
    from status 
    where status = 2 
) two_ids 
on all_ids.order_id = two_ids.order_id 
where two_ids.order_id is null 
1

另一種方法是使用EXCEPT:(和在Oracle中,如果你用MINUS更換EXCEPT

SELECT order_id 
FROM StatusTable 

EXCEPT 

SELECT order_id 
FROM StatusTable 
WHERE status = 2; 

它可以在SQL-Server和Postgres的