postgresql 更新另一个表中连接列的唯一值/组合

d7v8vwbk  于 2023-01-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(120)

我有大约918,555行的**table1,它是来自table 2的26列(a:cc)的连接标题
| 身份证|集|连接|结果|
| - ------|- ------|- ------|- ------|
| 1个|第二章|a、B|无|
| 第二章|四个|a、c、f、i|无|
| 三个|五个|a、d、o、x、y|无|
| 四个|第二章|a、e|无|
| 五个|第二章|a、f|无|
| 六个|三个|a、g、x|无|
| 七|第二章|a、h|无|
| 八个|五个|a、i、l、r、s|无|
| 九|第二章|a、j|无|
| 十个|第二章|a、k|无|
表2包含大约60列和200万行,但只有26列(a:cc)与表1相关/链接,剩下的是一些其他数据,我不需要它们在表1中
| 身份证|项目a| B|(c)秘书长的报告|日|电子|f级|克|小时|我|j| k|升|米|数量|阿|p| q| r| S的|t|乌|五|w| x| Y型|z| aa| bb|立方厘米|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|十八|第二章|第二章|二十二|无|第二章|1个|第二章|1个|三个|1个|第二章|1个|三个|二十六|第二章|无|二十二|无|二十二|第二章|三十二|第二章|四个|第二章|第二章|1个|三个|无|
| 第二章|二十个|第二章|第二章|第二章|无|无|无|第二章|1个|四个|无|第二章|1个|四个|二十四|无|无|第二章|无|第二章|1个|三个|第二章|五个|无|无|无|四个|无|
| 三个|十个|第二章|第二章|二百二十二|无|第二章|1个|第二章|1个|第二章|1个|第二章|1个|第二章|二十四|无|第二章|第二章|无|第二章|1个|三个|1个|五个|无|第二章|1个|第二章|无|
| 四个|十二|第二章|第二章|三个|无|无|无|无|1个|三个|无|无|1个|三个|二十一|第二章|无|无|无|无|无|二十二|1个|四个|第二章|无|无|三个|无|
| 五个|十五|第二章|第二章|三个|无|无|无|无|1个|三个|无|无|1个|三个|二十一|第二章|无|第二章|无|第二章|1个|二十二|1个|四个|第二章|无|无|三个|无|
| 六个|二十个|第二章|第二章|第二章|无|无|无|无|1个|四个|无|无|1个|四个|二十个|第二章|无|第二章|无|无|无|二十二|第二章|四个|第二章|无|无|四个|无|
| 七|十五|第二章|第二章|二十二|无|无|无|无|1个|第二章|无|无|1个|第二章|二十一|第二章|无|第二章|无|无|无|二十二|第二章|四个|第二章|无|无|第二章|九|
| 八个|十八|第二章|第二章|二十二|无|无|无|无|1个|三个|无|无|1个|三个|二十一|第二章|无|第二章|无|无|无|二十二|1个|四个|第二章|无|无|三个|无|
| 九|八个|第二章|无|二十二|无|第二章|1个|无|1个|三个|1个|无|1个|三个|二十四|无|无|第二章|无|无|无|三个|第二章|五个|无|第二章|1个|三个|无|
| 十个|十四|第二章|第二章|三个|无|第二章|1个|无|1个|三个|1个|无|1个|三个|十二|无|第二章|二十二|无|第二章|1个|二十二|第二章|三个|无|第二章|1个|三个|无|
| 十一|十四|第二章|无|二百二十二|无|二十二|第二章|第二章|第二章|第二章|第二章|第二章|第二章|第二章|二十个|无|无|无|无|无|无|三个|三个|四个|无|二十二|第二章|第二章|无|
串联的
2-7组**色谱柱基于以下标准;

2 sets of concatenated data from 26 columns = 325 rows/combinations (like “a,b”, “a,c”, “a,d”…...)
3 sets of concatenated data from 26 columns = 2,600 rows/combinations (like “a,b,c”, “a,b,d”, “a,b,e”……)
4sets of concatenated data from 26 columns  = 14,950 rows/combinations (like “a,b,c,d”, “a,b,c,e”, “a,b,c,f”……)
5sets of concatenated data from 26 columns = 65,780 rows/combinations (like “a,b,c,d,e”, “a,b,c,d,f”, “a,b,c,d,g”……)
6sets of concatenated data from 26 columns = 177,100 rows/combinations (like “a,b,c,d,e,f”, “a,b,c,d,e,g”, “a,b,c,d,e,h”……)
7sets of concatenated data from 26 columns = 657,800 rows/combinations (like “a,b,c,d,e,f,g”, “a,b,c,d,e,f,h”, “a,b,c,d,e,f,i”……)

我希望table 2中的每一个连接列的结果都在table 1中更新,仅在计算唯一值/组合之后更新。
已尝试以下代码,但出现错误。

update table1 set result=(SELECT COUNT(*) 
FROM (SELECT DISTINCT (select joins from table1) FROM table2) as dists);
vs91vp4v

vs91vp4v1#

正如评论中提到的:你可以使用plpgsql动态命令来构造你的查询:

do $$ 
declare 
  rec record;
  current_joins text;
  current_result int;
begin
  for rec in select joins from table1 loop
     select rec.joins into current_joins;
     execute format('select count(*) 
                     from (
                        select distinct %1$s
                        from table2 
                     ) as some_alias;',
                     current_joins) 
              into current_result;
     update table1 set result=current_result where joins=current_joins;
  end loop;
end $$;

它只是循环遍历您的“连接”,并对每个连接执行一次查询,更新相应的“结果”字段:

select * from table1;
   joins   | result
-----------+--------
 a,b       |      7
 a,c,f,i   |      9
 a,d,o,x,y |     11
 a,e       |      7
 a,f       |      9
 a,g,x     |     10
 a,h       |     10
 a,i,l,r,s |     10
 a,j       |      9
 a,k       |      9

Online demo。上面是为了说明这个原理-我并不期望你真的想要一个随机的“计数”作为你的结果。如果你能多解释一下你的逻辑会有帮助,也许可以添加一个明确的示例结果。

相关问题