如何重写此Oracle查询以使用有效的CTE

问题描述

我有一个查询,希望通过使用with子句来改进。我尝试了一个下面的变体,但是我只能降低一点成本。我该如何重写查询的主要部分,即联接的主要部分仅使用一次with子句记住,同时要记住,对于第二个子集,我有这个附加过滤器AND WS.CODE ='S_WLM_WL_013'

任何想法都会受到赞赏。

查询是

SELECT
CASE
WHEN ( SELECT COUNT(*)
      FROM EXIM1B.GER_CUSTOMER_ONBOARDING GCO
        INNER JOIN EXIM1B.ALERT_HEADER AH
      ON AH.AT_ID=GCO.WLM_TRANSACTION_ID
  INNER JOIN EXIM1B.WORKFLOW_STATUSES WS
  ON AH.WW_STATUS_CODE    =WS.CODE
  WHERE GCO.MESSAGE_ID    =:1
  AND GCO.IDENTIFICATOR_ID=
    (SELECT MIN(IDENTIFICATOR_ID)
    FROM EXIM1B.GER_CUSTOMER_ONBOARDING
    WHERE MESSAGE_ID=:1
    )
    )  =
  (SELECT COUNT(*)
  FROM EXIM1B.GER_CUSTOMER_ONBOARDING GCO
  INNER JOIN EXIM1B.ALERT_HEADER AH
  ON AH.AT_ID=GCO.WLM_TRANSACTION_ID
  INNER JOIN EXIM1B.WORKFLOW_STATUSES WS
  ON AH.WW_STATUS_CODE    =WS.CODE
  AND WS.CODE             ='S_WLM_WL_013'
  WHERE GCO.MESSAGE_ID    =:1
  AND GCO.IDENTIFICATOR_ID=
    (SELECT MIN(IDENTIFICATOR_ID)
    FROM EXIM1B.GER_CUSTOMER_ONBOARDING
    WHERE MESSAGE_ID=:1
    )
  )
THEN 'OK'
ELSE null  END AS StatusAlert FROM DUAL

我尝试过这个

with t as ( SELECT MIN(IDENTIFICATOR_ID) as minval,message_id FROM EXIM1B.GER_CUSTOMER_ONBOARDING WHERE MESSAGE_ID=:1 group by message_id ) 
SELECT
  CASE
    WHEN ( SELECT COUNT(*) 
           FROM EXIM1B.GER_CUSTOMER_ONBOARDING GCO inner join t on t.message_id = gco.message_id 
            INNER JOIN EXIM1B.ALERT_HEADER AH
           ON AH.AT_ID=GCO.WLM_TRANSACTION_ID
            INNER JOIN EXIM1B.WORKFLOW_STATUSES WS
           ON AH.WW_STATUS_CODE    =WS.CODE
          WHERE GCO.MESSAGE_ID    =:1
          AND GCO.IDENTIFICATOR_ID = t.minval 
         )  =
       (SELECT COUNT(*)
        FROM EXIM1B.GER_CUSTOMER_ONBOARDING GCO inner join t on t.message_id = gco.message_id 
       INNER JOIN EXIM1B.ALERT_HEADER AH
       ON AH.AT_ID=GCO.WLM_TRANSACTION_ID
       INNER JOIN EXIM1B.WORKFLOW_STATUSES WS
       ON AH.WW_STATUS_CODE    =WS.CODE
       AND WS.CODE             ='S_WLM_WL_013'
       WHERE GCO.MESSAGE_ID    =:1
       AND GCO.IDENTIFICATOR_ID = t.minval
      )
    THEN 'OK'
    ELSE null  END AS StatusAlert FROM DUAL

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)