SQL用另一列值替换NULL并更新数据表的报错解决
错误原因
你的更新语句存在两个核心问题:
- UPDATE中的子查询没有和待更新的当前行做关联,会返回多行结果,数据库无法确定给每行赋哪个值,因此触发报错。
- 关联条件漏了
a.UniqueID <> b.UniqueID,会出现自关联的无效匹配,同时冗余的CASE判断完全不需要,WHERE条件已经筛选出了PropertyAddress为NULL的行,直接赋值即可。
正确写法
适用于MySQL等支持JOIN直接更新的数据库
UPDATE nashvillehousing a JOIN nashvillehousing b ON a.ParcelID = b.ParcelID AND a.UniqueID <> b.UniqueID SET a.PropertyAddress = b.PropertyAddress WHERE a.PropertyAddress IS NULL AND b.PropertyAddress IS NOT NULL;
适用于SQL Server的写法
UPDATE a SET PropertyAddress = b.PropertyAddress FROM nashvillehousing a JOIN nashvillehousing b ON a.ParcelID = b.ParcelID AND a.UniqueID <> b.UniqueID WHERE a.PropertyAddress IS NULL AND b.PropertyAddress IS NOT NULL;
注意事项
- 执行更新前先运行以下查询验证匹配结果是否符合预期,确认无误后再执行更新操作:
SELECT a.ParcelID, a.PropertyAddress 待更新空地址, b.ParcelID, b.PropertyAddress 匹配到的地址 FROM nashvillehousing a JOIN nashvillehousing b ON a.ParcelID = b.ParcelID AND a.UniqueID <> b.UniqueID WHERE a.PropertyAddress IS NULL AND b.PropertyAddress IS NOT NULL;
- 建议操作前先备份全表数据,避免误操作导致数据丢失。
内容的提问来源于stack exchange,提问作者Neville Jeffree
相关产品推荐
相关产品推荐

