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 过滤查询结果的主要内容,如果未能解决你的问题,请参考以下文章