db2 - DB2-SQL Select Query 根据字段值获取前几条记录
问题描述
在此处输入图像描述 您好,
我需要从 3 个表中读取数据,然后我必须将这些记录处理到目标系统。我写了一个如下所示的选择查询来获取数据。
表 A 具有 A1、A2、A3、A4、A5 等字段
表 B 具有 B1、B2、B3 等字段
表 C 具有 C1、C2、C3 等字段
except 函数用于从选择查询结果中消除少量记录。
select A1,A2,A3,A4,A5,B1,B2,B3,C1,C2,C3
from tableA
left outer join tableB
on (tableA.A1=tableB.B1) and (tableA.A2=tableB.B2)
left outer join tableC
on (tableA.A1=tableC.C1)
where ORDERDATE='01/01/2019'
Except
select A1,A2,A3,A4,A5,B1,B2,B3,C1,C2,C3
from tableA
left outer join tableB
on (tableA.A1=tableB.B1) and (tableA.A2=tableB.B2)
left outer join tableC
on (tableA.A1=tableC.C1)
where ORDERDATE='01/01/2019'
and tableA.A3='Y'
现在这个查询工作正常并返回如下所示的 1000 条记录。
(或者请检查附件/下面的链接以获取正确对齐的输出图像)
+------------+--------------+---------------+----------+------+------+------+----------+------+------+----------+
| A1 (order) | A2(Sequence) | A3(orderDate) | A4 | A5 | B1 | B2 | B3 | C1 | C2 | C3 |
+------------+--------------+---------------+----------+------+------+------+----------+------+------+----------+
| 1111 | 1 | 1/1/2019 | wqe | 3e | 1111 | qq | 1/1/2019 | 1111 | 1 | 1/1/2019 |
| 1111 | 2 | 1/1/2019 | qe | 4r | 1111 | aa | 1/1/2019 | 1111 | 2 | 1/1/2019 |
| 1111 | 3 | 1/1/2019 | qwe | | 1111 | ss | 1/1/2019 | 1111 | 3 | 1/1/2019 |
| 2222 | 1 | 1/1/2019 | | tg | 2222 | cc | 1/1/2019 | 2222 | 1 | 1/1/2019 |
| 3333 | 1 | 1/1/2019 | eqw | | 3333 | vv | 1/1/2019 | 3333 | 1 | 1/1/2019 |
| 3333 | 2 | 1/1/2019 | qweq | 5y | 3333 | bb | 1/1/2019 | 3333 | 2 | 1/1/2019 |
| 3333 | 3 | 1/1/2019 | | 5u | 3333 | nn | 1/1/2019 | 3333 | 3 | 1/1/2019 |
| 3333 | 4 | 1/1/2019 | qwe | | 3333 | mm | 1/1/2019 | 3333 | 4 | 1/1/2019 |
| 4444 | 6 | 1/1/2019 | | 4g | 4444 | mn | 1/1/2019 | 4444 | 6 | 1/1/2019 |
| 9999 | 7 | 1/1/2019 | wqw | 8m | 9999 | yu | 1/1/2019 | 9999 | 7 | 1/1/2019 |
+------------+--------------+---------------+----------+------+------+------+----------+------+------+----------+
但我想修改我的选择查询以一次获取一个订单的所有记录。这样我就可以处理这些记录并更改这些记录的状态。然后下次运行查询时,它将获取下一个订单“2222”的记录,依此类推..
所以从上面的例子中:如果我运行选择查询,我必须只获取订单 1111 的记录(前 3 条记录)。
谢谢你。
解决方案
您可以使用OLAP 规范RANK
中的函数。
WITH A AS
(
-- Your original query
select A1,A2,A3,A4,A5,B1,B2,B3,C1,C2,C3
from tableA
left outer join tableB
on (tableA.A1=tableB.B1) and (tableA.A2=tableB.B2)
left outer join tableC
on (tableA.A1=tableC.C1)
where ORDERDATE='01/01/2019'
Except
select A1,A2,A3,A4,A5,B1,B2,B3,C1,C2,C3
from tableA
left outer join tableB
on (tableA.A1=tableB.B1) and (tableA.A2=tableB.B2)
left outer join tableC
on (tableA.A1=tableC.C1)
where ORDERDATE='01/01/2019'
and tableA.A3='Y'
-- End of your original query
)
SELECT *
FROM
(
SELECT A.*, RANK() OVER (ORDER BY A1) RK_
FROM A
)
WHERE RK_=1;
您的查询当然不能返回已处理的订单。
推荐阅读
- python - 如何在python中将列表列表转换为数组?
- php - SIMPLE_DOM_HTML.PHP .. 想要从网站的所有 html 类中获取数据,但该网站上存在延迟加载
- r - tmap:将插图与 tmap_arrange 合并
- c++ - 如何从具有该类内部函数的类中正确运行渲染线程?
- node.js - 更新redis中用户的分数
- php - 当它是stdClass对象Codeigniter 4时无法获取对象属性
- sql-server - 日期添加副作用?
- android - 我的 EditText 的 Textwatcher 多次触发 afterTextChanged
- c# - AutoMapper 的属性映射 - Multiple [SourceMember]
- swift - PDFKit CGRect 剪辑到文本大小 SwiftUI