我是mysql的新手,我一直在尝试遵循一些教程,我遇到了一些错误
UPDATE a
SET PropertyAddress = IFNULL(a.PropertyAddress,b.PropertyAddress)
FROM nashvillehousing a
JOIN nashvillehousing b
ON a.ParcelID = b.ParcelID
AND a.UniqueID <> b.UniqueID
这里我试图用同一表的同一列重新填充a的PropertyAddress列。但是它显示了错误"FROM在此位置无效,期望EOF, ';'">
我检查了其他解决方案,并将我的查询修改为
UPDATE nashvillehousing a
JOIN nashvillehousing b
ON a.ParcelID = b.ParcelID
SET a.PropertyAddress = IFNULL(a.PropertyAddress,b.PropertyAddress)
AND a.UniqueID <> b.UniqueID
返回
Error Code: 2013. Lost connection to MySQL server during query 30.000 sec
有谁能帮我一下吗?由于and应该是where子句
UPDATE nashvillehousing a
JOIN nashvillehousing b
ON a.ParcelID = b.ParcelID
SET a.PropertyAddress = COALESCE(a.PropertyAddress,b.PropertyAddress)
WHERE a.UniqueID <> b.UniqueID
或者输入join
UPDATE nashvillehousing a
JOIN nashvillehousing b
ON a.ParcelID = b.ParcelID AND a.UniqueID <> b.UniqueID
SET a.PropertyAddress = COALESCE(a.PropertyAddress,b.PropertyAddress)
您没有提供示例数据,但是您的查询有一个主要问题,即每个parcelId
可能有多个具有有效地址的匹配。为了避免这种情况,聚合要匹配的表:
UPDATE nashvillehousing n JOIN
(SELECT ParcelId, MAX(PropertyAddress) as PropertyAddress
FROM nashvillehousing n2
GROUP BY ParcelId
) n2
ON n2.ParcelID = n.ParcelID
SET PropertyAddress = n2.PropertyAddress
WHERE n.PropertyAddress IS NULL AND
n2.PropertyAddress IS NOT NULL;
注意,WHERE
子句只更新需要更新的行。
你的第一个查询没有使用MySql语法,这就是为什么你得到错误。
在第二个查询中,您必须移动ON
子句中的条件a.UniqueID <> b.UniqueID
。
此外,由于您想要更新PropertyAddress
的值仅为null
,您应该为此添加WHERE
子句,并删除IFNULL()
:
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;
请注意,如果UniqueID
实际上是每一行的唯一id,那么您根本不需要条件a.UniqueID <> b.UniqueID
,因为这是由WHERE
子句处理的,其中过滤掉了相同行的匹配。