[英]Adding conditions in MERGE statement in Oracle SQL for INSERT/UPDATE
[英]Oracle SQL Merge Statement with Conditions
我对 SQL 比较陌生,我遇到了目标表未更新的问题。我有重复的帐户 #(键),在相关列中具有不同的联系信息。我正在尝试合并联系信息(源)进入单行/帐号,不重复的联系信息进入(目标)扩展列。
我构造了一个带有 case 条件的 Merge 语句来检查数据是否存在于目标表中。 如果数据不在目标表中,则在扩展列中添加信息。 问题是目标表没有得到更新。 源表和目标表都是相似性定义的。
**Merge SQL- reduced query**
MERGE INTO target tgt
USING (select accountno, cell, site, contact, email1 from (select w.accountno, w.cell, w.site, w.contact, email1, row_number() over (PARTITION BY w.accountno order by accountno desc) acct
from source w) inn where inn.acct =1) src
ON (tgt.accountno = src.accountno)
WHEN MATCHED
THEN
UPDATE SET
tgt.phone4 =
CASE WHEN src.cell <> tgt.cell
THEN src.cell
END,
tgt.phone5 =
CASE WHEN src.site <> tgt.site
THEN src.site
END
我已验证源表中存在应添加到目标表中的 accountno 的联系信息。 我非常感谢任何关于为什么没有更新目标表的见解。 我在 Stack 上看到了类似的问题,但没有回复。
您在 using 子句中的 SRC 子查询为每个 accountno 仅返回 1 个随机行。 您需要聚合它们,例如使用 PIVOT:
with source(accountno, cell, site, contact) as ( --test data:
select 1,8881234567,8881235678,8881236789 from dual union all
select 1,8881234567,8881235678,8881236789 from dual
)
select accountno, contact,
r1_cell, r1_site,
r2_cell, r2_site
from (select s.*,row_number()over(partition by accountno order by cell) rn
from source s
)
pivot (
max(cell) cell,max(site) site
FOR rn
IN (1 R1,2 R2)
)
所以最后你可以将 r1_cell、r1_site、r2_cell、r2_site 与目标值进行比较并使用所需的值:
MERGE INTO target tgt
USING (
select accountno, contact,
r1_cell, r1_site,
r2_cell, r2_site
from (select s.*,row_number()over(partition by accountno order by cell) rn
from source s
)
pivot (
max(cell) cell,max(site) site
FOR rn
IN (1 R1,2 R2)
)
) src
ON (tgt.accountno = src.accountno)
WHEN MATCHED
THEN
UPDATE SET
tgt.phone4 =
CASE
WHEN src.r1_cell <> tgt.cell
THEN src.r1_cell
ELSE src.r2_cell
END,
tgt.phone5 =
CASE WHEN src.r1_site <> tgt.site
THEN src.r1_site
ELSE src.r2_site
END
/
问题在于您在 row_numbering 具有相同 account_number 的行中使用的逻辑。
MERGE
INTO target tgt
USING (select accountno, cell, site, contact, email1
from (select w.accountno, w.cell, w.site, w.contact, email1
, row_number() over (PARTITION BY w.accountno order by w.accountno desc) acct
from source w
left join target w2
on w.accountno=w2.accountno
where w2.cell is null /* get records which are not in target*/
) inn
where inn.acct =1
) src
ON (tgt.accountno = src.accountno)
WHEN MATCHED THEN
UPDATE
SET tgt.phone4 = src.cell,
tgt.phone5 = src.site
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.