问题描述
我在下面有一个合并语句,并且要添加以下条件:如果X_RECEIVED_ON_DT为null,它将使用FULFILLED_ON_DT和PO_CLOSED_DT中的日期(它们是TGT(目标表)中的列)填充TGT.X_GAAP_EXCH_RATE_WID列
MERGE
/*+ PARALLEL(8) */
INTO W_PURCH_COST_F TGT USING
(SELECT
/*+ PARALLEL(8) */
cost.INTEGRATION_ID,cost.X_RECEIVED_ON_DT,cost.LOC_CURR_CODE,COALESCE(gaap.ROW_WID,0) X_GAAP_EXCH_RATE_WID
FROM W_Purch_Cost_F_3955 cost
JOIN W_DAY_D wday
ON TRUNC(cost.X_RECEIVED_ON_DT)=TRUNC(wday.CALENDAR_DATE)
LEFT OUTER JOIN WC_GAAP_EXCH_RATE_G gaap
ON gaap.PERIOD =wday.PER_NAME_ENT_PERIOD
AND cost.LOC_CURR_CODE =gaap.FROM_CURCY_CD
) SRC ON (TGT.INTEGRATION_ID = SRC.INTEGRATION_ID AND TGT.DATASOURCE_NUM_ID = 310)
WHEN MATCHED THEN
UPDATE SET TGT.X_GAAP_EXCH_RATE_WID = SRC.X_GAAP_EXCH_RATE_WID;
解决方法
如果要在 source 查询中引用W_PURCH_COST_F
(别名TGT
),则必须将其包含在SRC
的{ {1}}子句。
这意味着您在此FROM
语句中将有两个W_PURCH_COST_F
表-一个作为合并目标(如您现在所拥有),另一个作为“源”,用于与其他表连接MERGE
中的表格。然后,使用SRC
,NVL
或CASE
做您想做的事情很简单。
不过,我不太了解您将如何同时使用DECODE
和FULFILLED_ON_DT
,但希望您知道。
基于Scott的架构的示例(因为我没有您的表格)
这行不通-您无法在PO_CLOSED_DT
中引用TGT
:
SRC
但是,如果在SQL> merge into emp e
2 using (select distinct d.deptno,d.dname,d.loc
3 from dept d
4 where d.deptno = e.deptno --> not allowed
5 ) x
6 on (e.deptno = x.deptno)
7 when matched then update set e.ename = x.loc;
where d.deptno = e.deptno
*
ERROR at line 4:
ORA-00904: "E"."DEPTNO": invalid identifier
的{{1}}子句中使用,它将有效:
SRC
您可能要考虑的选项是:
-
嵌套的
FROM
:SQL> merge into emp e 2 using (select distinct d.deptno,d.loc 3 from dept d join emp a on a.deptno = d.deptno 4 ) x 5 on (e.deptno = x.deptno) 6 when matched then update set e.ename = x.loc; 14 rows merged. SQL>
-
NVL
(返回第一个非空值):nvl(x_received_on_dt,nvl(fulfilled_on_dt,po_closed_dt))
coalesce
对我来说似乎是一个更好的选择。