MySQL联表更新填充空字段报1064语法错误求助
问题背景
执行表更新操作时触发MySQL报错:Error Code: 1064. You have an error in your SQL syntax,错误定位到第3行FROM portfolio.nashville_housing_data INNER JOIN portfolio.nashville_housing_dat片段。
需求为:对portfolio库下的nashville_housing_data表,将同ParcelID下PropertyAddress为NULL的记录,填充为该ParcelID对应的非空PropertyAddress值,示例数据结构:
ParcelID PropertyAddress 11111 1234 St City 11111 NULL
原执行的UPDATE语句如下:
UPDATE a SET PropertyAddress = IFNULL(a.PropertyAddress, b.PropertyAddress) FROM portfolio.nashville_housing_data a INNER JOIN portfolio.nashville_housing_data b on a.ParcelID = b.ParcelID and a.UniqueID <> b.UniqueID WHERE a.PropertyAddress is null
错误原因
你使用的是SQL Server/PostgreSQL支持的UPDATE...SET...FROM多表更新语法,MySQL不支持该语法结构,解析到SET之后的FROM关键字时无法识别语法规则,因此抛出1064语法错误。
修正方案
MySQL的多表更新语法需要将关联的JOIN子句直接跟在UPDATE后的目标表之后,不需要额外写FROM引入关联表,修正后的可执行语句如下:
UPDATE portfolio.nashville_housing_data a INNER JOIN portfolio.nashville_housing_data b ON a.ParcelID = b.ParcelID AND a.UniqueID <> b.UniqueID SET a.PropertyAddress = IFNULL(a.PropertyAddress, b.PropertyAddress) WHERE a.PropertyAddress IS NULL;
注意事项
- 正式执行更新前,建议先执行查询语句校验匹配到的待填充数据是否符合预期,避免误更新:
SELECT a.UniqueID, a.ParcelID, a.PropertyAddress AS empty_address, b.PropertyAddress AS will_fill_address FROM portfolio.nashville_housing_data a INNER JOIN portfolio.nashville_housing_data b ON a.ParcelID = b.ParcelID AND a.UniqueID <> b.UniqueID WHERE a.PropertyAddress IS NULL;
- 如果同一个ParcelID对应多条非空PropertyAddress,建议先做数据去重,避免填充结果不符合预期。
内容的提问来源于stack exchange,提问作者CCast
相关产品推荐
相关产品推荐

