【发布时间】:2020-12-25 23:06:59
【问题描述】:
我有一个查询,我想通过使用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
【问题讨论】:
-
您是否已经尝试过
/*+ materialize */提示? -
@Sujitmohanty30,我试过了,但没用
-
请分享您的索引。您是否有权创建索引?
标签: sql oracle oracle12c with-statement