DB2-SQL选择查询以基于字段值获取前几条记录

时间:2019-09-27 17:20:16

标签: db2 ibm-midrange

enter image description here 你好,

我需要从3个表中读取数据,然后我必须将这些记录处理到目标系统。我编写了如下所示的选择查询以获取数据。

表A具有类似A1,A2,A3,A4,A5的字段

表B具有类似B1,B2,B3的字段

表C具有类似C1,C2,C3的字段

除功能用于从选择查询结果中消除一些记录。

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

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

Output data for above query -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条记录)。

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用OLAP specifications中的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;

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

相关问题