提问人:Riinu Anslan 提问时间:7/29/2023 最后编辑:BohemianRiinu Anslan 更新时间:8/13/2023 访问量:169
在 postgresql 中使用 COALESCE 和 UPDATE
Using COALESCE in postgresql with UPDATE
问:
我有一个房地产数据表,地址列中有很多 NULL。我想根据唯一 ID 替换这些 null。 (我正在学习 Alex the Analyst 教程)。但是,当我在postgresql中使用它时,我收到一个错误:
错误:关系“a”不存在
UPDATE a SET
propertyaddress = COALESCE(a.propertyaddress, b.propertyaddress)
FROM nashville_housing_data a
JOIN nashville_housing_data b
ON a.parcelid = b.parcelid
AND a.uniqueid <> b.uniqueid
WHERE propertyaddress is null
现在,当我替换为表名时,它将所有地址行更新为一个特定地址。a
答:
0赞
Bohemian
7/29/2023
#1
您无法 UPDATE 别名;必须使用表名。
此外,这里是无用的,因为条件保证第一项始终为空,所以只需分配 .COALESCE
WHERE propertyaddress is null
b.propertyaddress
试试这个:
UPDATE nashville_housing_data SET
propertyaddress = b.propertyaddress
FROM nashville_housing_data
JOIN nashville_housing_data b
ON nashville_housing_data.parcelid = b.parcelid
AND nashville_housing_data.uniqueid <> b.uniqueid
WHERE nashville_housing_data.propertyaddress is null
如果可以有多个其他行具有匹配的 parcelid,请使用 MAX() 打破联系:
...
propertyaddress = MAX(b.propertyaddress)
...
0赞
Nisar Mehmood
7/29/2023
#2
这里的问题是表别名“a”。不能在 UPDATE 语句中使用别名直接引用更新的表。相反,如果您直接引用表名,则会有所帮助。尝试使用别名为“a”的查询。
UPDATE nashville_housing_data
SET propertyaddress = COALESCE(propertyaddress, b.propertyaddress)
FROM nashville_housing_data b
WHERE nashville_housing_data.propertyaddress IS NULL
AND nashville_housing_data.parcelid = b.parcelid
AND nashville_housing_data.uniqueid <> b.uniqueid;
0赞
lemon
7/29/2023
#3
您确实可以使用别名,但不能使用显式连接表示法,因为您需要为表“a”添加两次引用。在这种情况下,最好直接在子句中引用第二个表,并带有别名,并在子句中添加连接条件。FROM
WHERE
此外:
- 您不需要使用 ,因为您正在将 Table1 的 null 值与 table2 的非 null 值进行匹配(您可以只取 table2 值)
COALESCE
- 您可以使用 代替 ,这应该会稍微更有效(当您的记录在“T2.PropertyAddress”列中具有所有 null 值时,您只需跳过对该 “T1.uniqueID” 值的更新)
a.uniqueid <> b.uniqueid
b.propertyaddress IS NOT NULL
- 并不是真的严格需要,但作为一种可选的首选项,当我自行加入同一个表时,我喜欢使用 t1 和 t2,以提醒自己它总是相同的“t”,但引用了两次
UPDATE nashville_housing_data t1
SET propertyaddress = t2.propertyaddress
FROM nashville_housing_data t2
WHERE t1.parcelid = t2.parcelid
AND t1.propertyaddress IS NULL
AND t2.propertyaddress IS NOT NULL;
这里有一个小演示。
0赞
Riinu Anslan
7/30/2023
#4
我玩了这个,并想出了我自己问题的答案:
UPDATE nashville_housing_data a
SET propertyaddress = COALESCE(a.propertyaddress, b.propertyaddress)
FROM nashville_housing_data b
WHERE a.parcelid = b.parcelid
AND a.uniqueid <> b.uniqueid
AND a.propertyaddress IS NULL;
-1赞
Raja Rakshak
7/30/2023
#5
您的 SQL 查询似乎有问题,因为在 UPDATE 语句中使用了表的别名。在 PostgreSQL 中使用 UPDATE 子句时,别名应引用正在修改的目标表,而不是要联接的表。您应按如下方式更改查询,以便根据唯一 ID 正确更新 propertyaddress 列:
UPDATE nashville_housing_data a
SET propertyaddress= COALESCE(a.propertyaddress, b.propertyaddress)
FROM nashville_housing_data b
WHERE a.parcelid= b.parcelid
AND a.uniqueid <> b.uniqueid
AND a.propertyaddress IS NULL;
我认为,通过修改查询,您不应该出现任何错误。
评论
parcelid