首页 > 解决方案 > 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 条记录。

(或者请检查附件/下面的链接以获取正确对齐的输出图像)

上述查询的输出数据 -Image-Attachment

+------------+--------------+---------------+----------+------+------+------+----------+------+------+----------+
| 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 条记录)。

谢谢你。

标签: db2ibm-midrange

解决方案


您可以使用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;

您的查询当然不能返回已处理的订单。


推荐阅读