Oracle SQL中如何基于自连接(关联customer_po与ID)更新表
Oracle SQL自连接更新表的解决方案
这问题我之前也碰到过,用Oracle的MERGE语句就能完美解决,既简洁又能覆盖你需要的两种情况:
解决方案SQL
MERGE INTO XYZ tgt USING ( SELECT x.ID, COALESCE(y.Invoice_Date, x.Invoice_Date) AS new_delivery_date FROM XYZ x LEFT JOIN XYZ y ON x.Customer_po = y.ID ) src ON (tgt.ID = src.ID) WHEN MATCHED THEN UPDATE SET tgt.Delivery_date = src.new_delivery_date;
代码解释
- 子查询里用
LEFT JOIN把每一行和它Customer_po对应的行关联起来:如果某行的Customer_po不为空,就匹配到对应ID的行;如果Customer_po是null(比如ID=123的行),LEFT JOIN会返回null。 COALESCE函数用来做兜底处理:如果关联到了目标行(y.Invoice_Date有值),就用关联行的Invoice Date;如果没关联到(Customer_po为null),就用当前行自己的Invoice Date。MERGE INTO语句把子查询的结果和原表XYZ通过ID匹配,批量更新Delivery_date字段。
验证结果
执行完这段SQL后,你的表数据会完全符合目标输出:
ID | Invoice Date | Delivery_date | Customer_po
123 | 01-01-2018 | 01-01-2018 | null
125 | 10-01-2018 | 01-01-2018 | 123
内容的提问来源于stack exchange,提问作者user2207709
相关产品推荐
相关产品推荐

