在 postgresql 中使用 COALESCE 和 UPDATE

Using COALESCE in postgresql with UPDATE

提问人:Riinu Anslan 提问时间:7/29/2023 最后编辑:BohemianRiinu Anslan 更新时间:8/13/2023 访问量:169

问:

我有一个房地产数据表,地址列中有很多 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

PostgreSQL SQL更新 合并

评论

0赞 Bohemian 7/29/2023
最多还有 1 行相同吗?parcelid

答:

0赞 Bohemian 7/29/2023 #1

您无法 UPDATE 别名;必须使用表名。

此外,这里是无用的,因为条件保证第一项始终为空,所以只需分配 .COALESCEWHERE propertyaddress is nullb.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”添加两次引用。在这种情况下,最好直接在子句中引用第二个表,并带有别名,并在子句中添加连接条件。FROMWHERE

此外:

  • 您不需要使用 ,因为您正在将 Table1 的 null 值与 table2 的非 null 值进行匹配(您可以只取 table2 值)COALESCE
  • 您可以使用 代替 ,这应该会稍微更有效(当您的记录在“T2.PropertyAddress”列中具有所有 null 值时,您只需跳过对该 “T1.uniqueID” 值的更新)a.uniqueid <> b.uniqueidb.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;

我认为,通过修改查询,您不应该出现任何错误。