0

经过多次尝试,我在这方面失败了,希望有人能提供帮助。该查询返回用户在工厂生产项目时所做的每个条目和订单号。例如

Order Number   Entry type  Quantity
3000          1           1000
3000          1           500
3000          2           300
3000          2           100
4000          2           1000
5000          1           1000

我想要查询做的是像这样返回过滤结果

如果订单号具有条目类型 1 和 2,则仅返回类型为 1 的行,否则仅返回该订单号的类型。

所以上面会结束:

Order Number   Entry type  Quantity
3000          1           1000
3000          1           500
4000          2           1000
5000          1           1000

目前我的查询(DB2,在非常基本的术语中看起来像这样)并且在更改请求通过之前是正确的!

从 type=1 或 type=2 的预订中选择 *

谢谢!

4

2 回答 2

0
select * from bookings
    left outer join (
       select order_number,
          max(case when type=1 then 1 else 0 end) + 
             max(case when type=2 then 1 else 0 end) as type_1_and_2
          from bookings
          group by order_number
    ) has_1_and_2 on 
       type_1_and_2 = 2
       has_1_and_2.order_number = bookings.order_number
    where 
        bookings.type = 1 or 
        has_1_and_2.order_number is null

找到所有同时具有类型 1 和类型 2 的订单,然后加入它。

如果该行与连接匹配,则仅在类型为 1 时返回它 如果该行与连接不匹配,has_type_2.order_number is null则无论是什么类型都返回它。

于 2013-04-25T12:06:52.563 回答
0

通用表表达式” [CTE] 通常可以简化您的逻辑。您可以将其视为将复杂问题分解为概念步骤的一种方法。在下面的示例中,您可以将 g 视为 CTE 的结果集的名称,然后将其连接到

    WITH g as
    ( SELECT order_number, min(type) as low_type
        FROM bookings
        GROUP BY order_number
    )
    SELECT b.*
      FROM g 
      JOIN bookings b   ON  g.order_number = b.order_number
                        AND g.low_type     = b.type

JOIN ON 条件将起作用,因此如果两种类型都存在,则 low_type 将为 1,并且仅选择该类型的记录。如果只有一种类型,它将与 low_type 相同。

只要 1 和 2 是预订表中允许的唯一类型,这应该可以正常工作。如果没有,那么您可以简单地在 CTE 和外部 SELECT 中添加 WHERE 子句。

于 2013-04-25T22:32:45.787 回答