问题描述
我有一个查询,希望通过使用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 (将#修改为@)