子查询 SQL DB2

Subquery SQL DB2

我正在尝试在我的基本查询中创建一个子查询(针对特定列)。代码如下。

 SELECT    z.po_id,
          max
              (
              select   etcdc.ship_evnt_tms
              FROM     covinfos.shipment_event etcdc
              WHERE    etcdc.ship_evnt_cd = '9P'
              AND      etcdc.ship_id=scdc.ship_id
              ORDER BY etcdc.updt_job_tms desc
              FETCH first ROW only) AS llp_estimated_delivery_cdc
FROM      covinfos.ibm_plant_order z
LEFT JOIN covinfos.ipo_line_to_case a
ON        z.po_id = a.po_id
LEFT JOIN covinfos.shipment scdc
ON        (
                    a.ship_id = scdc.ship_id
          AND       a.ship_to_loc_code = scdc.ship_to_loc_code
          AND       scdc.loc_type = 'CDC')
GROUP BY  z.po_id 

根据我尝试 运行 代码时弹出的错误消息,似乎某处存在某种拼写错误。

BIC00004. DAL01008. An error occurred while accessing the database.
ILLEGAL SYMBOL ".". SOME SYMBOLS THAT MIGHT BE LEGAL ARE: , ). SQLCODE=-104, 
SQLSTATE=42601, DRIVER=3.62.56; THE CURSOR SQL_CURLH200C1 IS NOT IN A 
PREPARED STATE. SQLCODE=-514, SQLSTATE=26501, DRIVER=3.62.56

然而,在众目睽睽之下,或者至少在我看来,没有任何东西可以发现错误。此外,运行在空白 sheet 中选择子选择(在基本查询之外,新的查询)它是正确的。

谢谢

尝试在子 select 周围添加括号。至少这会使用 z/OS validation

解析 Data Studio
SELECT    z.po_id,
          max
              ((
              select   etcdc.ship_evnt_tms
              FROM     covinfos.shipment_event etcdc
              WHERE    etcdc.ship_evnt_cd = '9P'
              AND      etcdc.ship_id=scdc.ship_id
              ORDER BY etcdc.updt_job_tms desc
              FETCH first ROW only)) AS llp_estimated_delivery_cdc
FROM      covinfos.ibm_plant_order z
LEFT JOIN covinfos.ipo_line_to_case a
ON        z.po_id = a.po_id
LEFT JOIN covinfos.shipment scdc
ON        (
                    a.ship_id = scdc.ship_id
          AND       a.ship_to_loc_code = scdc.ship_to_loc_code
          AND       scdc.loc_type = 'CDC')
GROUP BY  z.po_id 

不过,我不确定这是不是一段很好的 SQL 代码。

您可能最好删除共同相关的子 select,并加入一个普通的子 select。例如

SELECT    z.po_id,
          max(ship_evnt_tms) AS llp_estimated_delivery_cdc
FROM      covinfos.ibm_plant_order z
LEFT JOIN covinfos.ipo_line_to_case a
ON        z.po_id = a.po_id
LEFT JOIN covinfos.shipment scdc
ON        a.ship_id = scdc.ship_id
AND       a.ship_to_loc_code = scdc.ship_to_loc_code
AND       scdc.loc_type = 'CDC'
LEFT JOIN
    (    select ship_id
         ,      ship_evnt_tms
         FROM
         (   select  ship_id
            ,        ship_evnt_tms
            ,        row_number() over(partition by ship_id order by updt_job_tms desc) as RN
            FROM     covinfos.shipment_event
            WHERE    ship_evnt_cd = '9P'
         ) s
         WHERE RN = 1
    )  AS etcdc
ON        etcdc.ship_id=scdc.ship_id
GROUP BY  z.po_id 

P.S。你可以只使用 INNER JOIN,除非你想包含 po_id 而没有 ship_evnt_tms