首页 > 解决方案 > postgreSQL 有一个表“xxx”的条目,但是不能从这部分查询中引用它

问题描述

编写此查询的正确方法是什么postgreSQL?我正在尝试规范化(即标准化)地址。如果我给它一个硬编码的地址,我可以pagc毫无问题地使用它。但是,我需要为它提供一个从部分解析的地址。我看到这里有几个关于堆栈溢出的类似问题引用了相同的错误。这些查询很复杂,而且都与我的完全不同,所以我无法通过阅读其他帖子找到解决方案。

我努力了:

with full_address as (home_address1 || ','|| home_city ||','|| home_state ||,','|| home_zip) update contacts set (home_house_num, home_predirection, home_street_name, home_street_type,home_postdirection, home_unit_num) = (addy.address_alphanumeric,addy.predirabbrev,addy.streetname, addy.streettypeabbrev,addy.postdirabbrev,addy.internal) FROM pagc_normalize_address(full_address) AS addy where contact_id = 833826;

这会引发错误:

“home_address1”或附近的语法错误第 26 行:full_address 为 (home_address1 || ','|| home_city |.

我也试过:

update contacts set (home_house_num, home_predirection, home_street_name, home_street_type,home_postdirection, home_unit_num) = (addy.address_alphanumeric,addy.predirabbrev,addy.streetname, addy.streettypeabbrev,addy.postdirabbrev,addy.internal) FROM pagc_normalize_address(home_address1 ||','||home_city||','||home_state||','||','||home_zip) AS addy where contact_id = 833826;

错误:

错误:对表“联系人”第 24 行的 FROM 子句条目的引用无效:...abbrev,addy.internal) FROM pagc_normalize_address(home_addre... ^ 提示:表“联系人”有一个条目,但不能从这部分查询引用 SQL 状态:42P10 字符:2297

标签: postgresqlpostgis

解决方案


第一个查询是胡言乱语,第二个是有意义的但失败了,因为您不能在FROM子句中使用对更新表的列的横向引用。

试试这样的 CTE:

WITH addy AS (
   SELECT addy.* FROM
      contacts
      CROSS JOIN LATERAL
      pagc_normalize_address(home_address1 
 || ',' || home_city || ',' || home_state || ',' || ',' || home_zip) AS addy
   WHERE contacts.contact_id = 833826
)
UPDATE contacts
SET (home_house_num, home_predirection, home_street_name, home_street_type,home_postdirection, home_unit_num)
    = (addy.address_alphanumeric,addy.predirabbrev,addy.streetname, addy.streettypeabbrev,addy.postdirabbrev,addy.internal)
FROM addy
WHERE contact_id = 833826;

推荐阅读