2

我完全坚持如何创建这个选择。我只需要从状态表中选择那些order_id没有状态 2 的。

这是表格:

+----+---------+---------+--
| 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

4 回答 4

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
于 2013-07-02T20:03:08.540 回答
3

这是一种方法。

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

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

于 2013-07-02T20:04:07.267 回答
1

另一种方法是使用EXCEPT

SELECT order_id
FROM StatusTable

EXCEPT

SELECT order_id
FROM StatusTable
WHERE status = 2;

它适用于 SQL-Server 和 Postgres(如果你EXCEPT用. 替换的话,它也适用于 Oracle MINUS。)

于 2013-07-02T20:24:37.320 回答
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
于 2013-07-02T20:09:48.203 回答