【发布时间】:2021-06-08 12:18:14
【问题描述】:
我有一个在 Windows 环境中运行的 Postgresql Server 11。我正在尝试根据调用另一个函数的返回数据来更新表列中的所有值。这是我到目前为止的进展:
UPDATE joa_clinics SET clinic_long = subquery.longitude
FROM (SELECT longitude FROM geocode_clinics_and_sales('NA', 'NA', 'NA', 'NA', '123 XYZ Street, Chicago IL 99999' ) ) as subquery;
UPDATE joa_clinics SET clinic_long = subquery.longitude
FROM (SELECT longitude FROM geocode_clinics_and_sales('NA', 'NA', 'NA', 'NA', select from joa_clinics.ServiceAddress::text ) ) as subquery;
所以表joa_clinics 有一个clinic_long 列,需要根据geocode_clinics_and_sales 函数调用的返回值进行更新;该函数返回 longitude 和 latitude 值。到目前为止,如果我传递一个硬编码的地址,我的顶级查询就可以工作。但地址应该是joa_clinics 表中ServiceAddress 的值,如底部查询所示。但是在那个查询中,我在第二个select 周围出现语法错误。帮助:joa_clinics 表中有一个 record_id 唯一列。
也许我走错了路?也许循环执行?我在 pgAdmin 中运行这些查询,但这无关紧要。现在,我可以手动运行它们——一个就完成了!
更新
我想我越来越近了,但所有值都相同,我需要在这个更新的查询中使用 WHERE 子句:
do
$$
declare
f record;
begin
for f in SELECT ServiceAddress FROM joa_clinics
loop
raise notice '%', f.ServiceAddress;
UPDATE joa_clinics SET clinic_long = subquery.longitude FROM
(SELECT longitude FROM geocode_clinics_and_sales('NA', 'NA', 'NA', 'NA', f.ServiceAddress )) as subquery;
end loop;
end;
$$
谢谢。
【问题讨论】:
-
谢谢。我想我已经尝试了问题中函数的一些变体,但得到“用作表达式的子查询返回的不止一行”错误
-
您可以通过将第二个查询包含在
()中来使第二个查询“工作”。那么错误将是您返回多个值。要完成这项工作,需要某种循环来一次处理一个单独的地址。 -
是的,我在发表原始评论后就知道了。
-
是的,我想我现在正在研究使用光标;不想,但必须继续前进。谢谢。
-
我会看看我是否可以使用光标:postgresqltutorial.com/plpgsql-cursor 谢谢
标签: postgresql sql-update subquery