【问题标题】:SQL Select records excluding some statusesSQL 选择不包括某些状态的记录
【发布时间】:2013-07-03 20:55:09
【问题描述】:

我完全不知道如何创建此选择。我只需要从状态表中选择那些没有状态 2 的order_id

这是表格:

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

【问题讨论】:

    标签: sql select


    【解决方案1】:

    这是集合内集合查询的示例:

    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
    

    【讨论】:

    • 这很好用,但是如果我想排除那些只有状态 1 的 order_id 并包括状态为 3 的 order_id(如前所述)......并且表格看起来像这样。
    【解决方案2】:

    这是一种方法。

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

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

    【讨论】:

      【解决方案3】:

      另一种方法是使用EXCEPT:

      SELECT order_id
      FROM StatusTable
      
      EXCEPT
      
      SELECT order_id
      FROM StatusTable
      WHERE status = 2;
      

      它适用于 SQL-Server 和 Postgres(如果您将 EXCEPT 替换为 MINUS,则适用于 Oracle。)

      【讨论】:

        【解决方案4】:

        我认为这是可行的,一个查询选择所有 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
        

        【讨论】:

          猜你喜欢
          • 2019-06-30
          • 2022-01-19
          • 2021-10-25
          • 1970-01-01
          • 1970-01-01
          • 2019-08-08
          • 2021-04-18
          • 2011-08-19
          • 1970-01-01
          相关资源
          最近更新 更多