Подзапрос 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

Тем не менее, на видном месте или, по крайней мере, на мой взгляд, нет ничего, что замечает ошибку. Кроме того, выполнение подвыбора на чистом листе (вне базового запроса, нового) выполняется правильно.

Спасибо

2 ответа

Решение

Возможно, вам лучше удалить сопутствующий суб-выбор и просто присоединиться к простому суб-выбору. Например

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 

PS вы можете просто присоединиться к INNER, если вы не хотите включать po_id без ship_evnt_tms

Попробуйте добавить круглые скобки вокруг суб-выбора. По крайней мере, это затем анализирует Data Studio с использованием проверки z/OS

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.

Другие вопросы по тегам