【问题标题】:DB2-SQL Select Query to fetch first few records based on a field valueDB2-SQL Select Query 根据字段值获取前几条记录
【发布时间】:2019-09-27 17:20:16
【问题描述】:

enter image description here 你好,

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

表 A 有 A1,A2,A3,A4,A5 等字段

表 B 有 B1,B2,B3 等字段

表 C 有 C1,C2,C3 等字段

Except函数用于从select查询结果中剔除少数记录。

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

谢谢。

【问题讨论】:

  • 示例数据未显示此内容,但您的数据是否有多个 A2(Sequence) 用于 A1(订单)
  • 问题:为什么是EXCEPT?为什么不只是SELECT ... WHERE tableA.A3 <> 'Y'?有办法做到这一点(可能最好使用数据更改表),但是为什么
  • 您好专家,请建议如何修改我的 SELECT 查询以实现上述要求。谢谢你。 YQ
  • 为什么要一次处理一个订单?你想完成什么?
  • 您似乎正试图在某种程度上缩短您的查询,因为提供的 SQL 不会产生显示的输出。问题是 A2 不等于 B2,并且 tableC 中有多个行与 tableA 中的 A1 匹配。如果您不向我们提供真实情况,我们真的无能为力。

标签: db2 ibm-midrange


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2016-04-05
    • 2015-11-12
    • 2012-03-24
    相关资源
    最近更新 更多