Source_table
postgres=# select id from tusers where active;
id
------
1011
1012
1013
1014
(4 rows)
# expected result after update [select id, id_user from ttasks;]
id | id_user
----+---------
1 | 1011
2 | 1012
3 | 1013
4 | 1014
5 | 1011
(5 rows)
我尝试的是什么(类似于...来自...语句的插入):
postgres=# update ttasks t1 set id_user = q1.id from (select id from tusers where active) q1 returning t1.id,t1.id_user;
id | id_user
----+---------
1 | 1011
2 | 1011
3 | 1011
4 | 1011
5 | 1011
(5 rows)
但此查询始终使用我的Q1子查询中的第一个ID。
任何想法,帮助甚至解决我该如何完成此任务的解决方案? 非常感谢!
P.S。这是我在这个社区上的第一篇文章,因此,如果我的问题中的某些内容不符合您的规则,请对我保持温和。
最终,在我的一个朋友告诉我,并非所有内容都可以以“保持愚蠢的方式”的方式编码时,我写了一个PLPQSQL(PL/PGSQL)功能,该功能为我完成了这项工作,不仅仅允许使用一些功能内部高级过滤器CREATE或替换函数sigts_workers_to_tasks(i_workers_table regclass,i_workers_table_tc text,i_tasks_table regclass,i_tasks_tasks_table_tc text,i_workers_filter text,i_workers_filter text default':: text,i_tasks_filter text defext text text,i_tasks_filter text Defalealett default text) 返回无效 $ body $ 声明工人int [];我整数; total_workers Integer; R记录; get_tasks文本; 开始 i_workers_filter:='where'|| nullif(i_workers_filter,''); i_tasks_filter:='where'|| nullif(i_tasks_filter,''); execute format('从%s seless s select array_agg(%s)(%s从%s serde s)s)q',i_workers_table_tc,i_workers_table_tc,i_workers_table,i_workers_table,i_workers_filter,i_workers_filter,i_workers_table_tc) 进入工人; - 可用[过滤]工人 total_workers:= cocece(array_length(工人,1),0); - 可用的[过滤]工人 如果total_worker = 0,则 执行格式('UPDATE%s SET%s = null%s',i_tasks_table,i_tasks_table_tc,i_tasks_filter); 返回; 如果结束; I:= 1; get_tasks:=格式('select *从%s%s',i_tasks_table,i_tasks_filter); - [过滤]任务 对于ececute(get_tasks)循环 执行格式('UPDATE%s SET%s =%s其中ID =%s',i_tasks_table,i_tasks_table_tc,workerers [i],r.id); i:= i+1; 如果我> total_worker,则i:= 1;如果结束; 结束循环; 返回; 结尾; $ body $ 语言PLPGSQL挥发性 费用100; ALTER函数分配_workers_to_tasks(regclass,文本,regclass,文本,文本,文本) 邮政局的所有者;
实现我自己的问题:
SELECTANDISS_WORKERS_TO_TASKS('Tusers','ID','ttasks','id_user','active');