【问题标题】:DB2 NSP SQL error, max time stamp on left joinDB2 NSP SQL 错误,左连接的最大时间戳
【发布时间】:2021-12-28 08:12:32
【问题描述】:

谁能帮我解决这个问题?

我有两个表,表 A 具有 product-id 和 Order-no 作为键,表 B 具有 Product-Id、Order-no(作为键)以及 Update_Timestamp、订单状态等。 ;试图获取表 A 中存在的所有匹配的 Product-Id 和 Order-number 已 a) 表 B 中的匹配记录 - 表 B 中订单的最新时间戳 b) 表 B 中的不匹配记录 在结果集中同时获得 a) 和 b),如下所示。

产品(表 A)

Product_id Order_no
1234567 S12345
1234568 S12346
1234569 P12347
1234575 M12347

订单详情(表 B)

Product_id Order_no Update_ts Order_stat
1234567 S12345 2020-05-05-05.01.02.123455 P
1234567 S12345 2020-06-05-05.01.02.123455 P
1234567 S12345 2020-07-05-05.01.02.123455 C
1234568 S12346 2021-05-05-06.01.02.123456 C
1234569 P12347 2021-05-05-06.01.02.000145 C
1234569 P12347 2021-06-05-06.01.02.000145 C
1234569 P12347 2021-07-05-06.01.02.000145 M
1234569 P12347 2021-08-05-06.01.02.000145 P
1234574 T12347 2021-07-05-06.01.02.000145 P

预期结果

Product_id Order_no Update_ts Order_stat
1234569 P12347 2021-08-05-06.01.02.000145 P
1234575 M12347 NULL NULL

查询:如果 Order_stat 需要过滤,例如产品 ID 的“P”订单状态,如果该订单状态存在且所有匹配订单的最新时间戳以及不匹配的记录为更多? .

编辑:尝试了以下查询,但出现错误:AN‬‎ ‪ON‬‎ ‪CLAUSE‬‎ ‪IS‬‎ ‪INVALID‬‎.‪‬‎ ‪SQLCODE‬‎=‪‬‎-‪338‬‎,‪‬‎ ‪SQLSTATE‬‎=‪42972‬‎,‪‬‎ ‪DRIVER‬‎=‪4‬‎.‪24‬‎.‪92。此错误已通过建议的最新查询解决,并希望对上述查询提出任何建议 您对如何获得预期结果有什么建议吗?

 select 
   aa.Product_id 
  ,aa.Order_no
  ,bb.Update_ts
  ,bb.Order_stat
  from
  Product         aa
  Left join
  Orderdetails    bb
  on   aa.product_id       =bb.product_id
  and  aa.order_no         =bb.order_no
  and  bb.update_ts        =(select max(cc.update_ts) from Orderdetails cc  
                                  where cc.product_id  = bb.product_id
                                    and cc.order_no    = bb.order_no
                                    and cc.order_stat  = bb.order_stat) 

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    参考SQL0338N的解释:

    SQL0338N 与 JOIN 运算符或在 MERGE 中关联的 ON 子句 声明无效。

    说明
    与 a 关联的 ON 子句 JOIN 运算符或在 MERGE 语句中对其中一个无效 以下原因。

    • ON 子句中的列引用只能引用 ON 子句范围内的表。
    • 在完全外连接的 ON 子句中引用的函数必须是确定性的,并且没有外部操作。
    • 无法使用取消引用操作 (->)。
    • MERGE 语句的 ON 子句不能包含子查询。
    • MERGE 语句的 ON 子句不能包含标量全查询。
    • MERGE 语句的 ON 子句不能包含内联 SQL 函数或内联 SQL 方法。

    无法处理该语句。

    请改用以下内容。如果(Product_id, Order_no) 是结果集的“唯一键”,则“基本查询”(无需分页)位于适合分页的完整查询中。

    select Product_id, Order_no, Update_ts, Order_stat
    from
    (
    select 
      a.*
    -- Enumeration for pagination  
    , row_number () over (order by Product_id, Order_no) as rn_
    from
    (
    -- Base query start
    select 
      aa.Product_id 
    , aa.Order_no
    , bb.Update_ts
    , bb.Order_stat
    from Product aa
    join 
    (
      select 
        o.*
      , row_number () over (partition by product_id, order_no order by update_ts desc) as rn_ 
      from Orderdetails o
    ) bb on bb.product_id = aa.product_id and bb.order_no = aa.order_no 
    and bb.order_stat = 'P' and bb.rn_ = 1
    
      union all
    
    select 
      aa.Product_id 
    , aa.Order_no
    , NULL AS Update_ts
    , NULL AS Order_stat
    from Product aa
    where not exists 
    (
    select 1 
    from Orderdetails bb 
    where bb.product_id = aa.product_id and bb.order_no = aa.order_no
    )
    -- Base query end
    ) a
    ) b
    -- Use of the enumeration for pagination
    where rn_ between 1 and 2
    order by 1, 2
    

    结果是:

    PRODUCT_ID ORDER_NO UPDATE_TS ORDER_STAT
    1234569 P12347 2021-08-05-06.01.02.000145 P
    1234575 M12347

    【讨论】:

    • 感谢@Mark Ba​​rinstein 提供的详细信息,它得到了预期的结果。如果只需要从上述结果集中获取一个特定的 order_stat 说“P”(如果作为最新订单存在),有什么建议吗? Product_id Order_no Update_ts Order_stat 1234567 S12345 2020-05-05-05.01.02.123456 P 1234569 P12347 2021-07-05-06.01.02.000145 P 1234575 M12347 NULL NULL
    • 要求only one specific order_stat say 'P' (if existing as latest order) 与结果中的行1234567 S12345 2020-05-05-05.01.02.123456 P 相矛盾。这一行不是(product_id, order_no) = (1234567, S12345) 的最后一行 - 最新一行是order_stat = 'C'。此外,检查Orderdetails 中的 2 first 完全相同的行是否是拼写错误。如果不是,那么您是否希望在输出中看到这两行?
    • 从上面的查询结果中如果只需要过滤掉一个特定的订单(如果存在匹配product_id,order_no有不同的order_stat和不同的time_stamp)以及没有匹配记录是希望看到的尽可能。这是上传的图片说明same
    • 为什么我们在输出中看到 3 行,而 product 表有 4 行?而且您还没有回答有关重复行的问题。
    • 对于product_id和order_no匹配,需要选择提供的orderstatus的最新update_ts(本例为P)。你是对的,之前有重复已被删除,更新图像细节here
    猜你喜欢
    • 1970-01-01
    • 2022-07-17
    • 2021-02-10
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多