Oracle SQL如何基于相似主键更新对应列的空值?
纳什维尔住房数据集地址字段空值补全SQL Server转Oracle方案
需求说明
处理纳什维尔住房数据集时,需要补全为空的PropertyAddress字段:业务规则为同一ParcelID对应的PropertyAddress值完全一致,仅UniqueID存在区别,需要将PropertyAddress为空的条目,用同ParcelID下的非空值填充。
现有可运行的Microsoft SQL Server实现代码,但无法在Oracle环境直接执行,需要做语法适配。
原SQL Server代码
Update a SET PropertyAddress = ISNULL(a.PropertyAddress,b.PropertyAddress) From PortfolioProject.dbo.NashvilleHousing a JOIN PortfolioProject.dbo.NashvilleHousing b on a.ParcelID = b.ParcelID AND a.[UniqueID ] <> b.[UniqueID ] Where a.PropertyAddress is null
适配后的Oracle实现
Oracle不支持SQL Server的UPDATE ... FROM ...多表关联更新语法,且空值判断函数ISNULL对应Oracle的NVL函数,带空格的特殊字段名需要用双引号包裹。推荐使用Oracle官方更稳妥的MERGE语句实现相同逻辑:
MERGE INTO NashvilleHousing a USING NashvilleHousing b ON (a.ParcelID = b.ParcelID AND a."UniqueID " <> b."UniqueID ") WHEN MATCHED THEN UPDATE SET a.PropertyAddress = NVL(a.PropertyAddress, b.PropertyAddress) WHERE a.PropertyAddress IS NULL;
替代写法(传统UPDATE子查询方式)
如果更习惯UPDATE语法也可以用以下写法,需要确保同ParcelID下只有唯一非空的PropertyAddress,否则会触发单行子查询返回多行的报错:
UPDATE NashvilleHousing a SET PropertyAddress = ( SELECT b.PropertyAddress FROM NashvilleHousing b WHERE a.ParcelID = b.ParcelID AND a."UniqueID " <> b."UniqueID " AND b.PropertyAddress IS NOT NULL FETCH FIRST 1 ROW ONLY ) WHERE a.PropertyAddress IS NULL;
注意事项
- 执行更新操作前建议先备份数据,或者先执行SELECT语句验证匹配的空值字段和填充值是否符合业务预期
- 以上两种写法都符合你设定的「同一ParcelID地址唯一」的业务前提,如果同ParcelID下存在多个不同的非空地址,会触发报错方便你排查脏数据
内容的提问来源于stack exchange,提问作者Y2RAV
相关产品推荐
相关产品推荐

