DB2 SQL 通过评估具有两种类型条目的 ID 过滤查询结果

Posted

技术标签:

【中文标题】DB2 SQL 通过评估具有两种类型条目的 ID 过滤查询结果【英文标题】:DB2 SQL filter query result by evaluating an ID which has two types of entries 【发布时间】:2013-04-25 11:56:03 【问题描述】:

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

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 的预订中选择 *

谢谢!

【问题讨论】:

【参考方案1】:
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) 不匹配,则无论类型是什么都返回它。

【讨论】:

【参考方案2】:

"common table expression" [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 是 bookings 表中允许的唯一类型,这应该可以正常工作。如果没有,那么您可以简单地在 CTE 和外部 SELECT 中添加 WHERE 子句。

【讨论】:

好悲痛。看来我已经倒着回答了这个问题。我很抱歉。上面的编辑应该可以满足您的要求。

以上是关于DB2 SQL 通过评估具有两种类型条目的 ID 过滤查询结果的主要内容,如果未能解决你的问题,请参考以下文章

sql db2 选择每个员工的最新条目及其以前的条目

选择带有某个条目的 ID DB2

DB2、MariaDB、MongoDB 的评估工具

如何在 SQL 中创建具有以下条件的 DB2 存储过程?

按组的 DB2 逗号分隔输出

SQL:按行条目数排序并加入