Redshift 中的嵌套 While 循环

Posted

技术标签:

【中文标题】Redshift 中的嵌套 While 循环【英文标题】:Nested While Loop in Redshift 【发布时间】:2021-01-27 15:48:00 【问题描述】:

我的 Table_1 看起来像这样

Parent_Id   Child_Id    Product Prod_count
1000          1            A    1
1000          2          A+B    1
1000          3            A    1
1000          4          B+C    1
2000          1            A    1
2000          2          B+C    1
2000          3            C    1
2000          4            D    1

我在这个过程中尝试在这里做嵌套循环,循环基于 Parent_Id,每个父母都有不同的孩子,所以也必须读取每一行。

我试过了

create or replace procedure sp_dummy(IN var1 int, IN var2 int, IN var3 int) as $$

Begin

create temp table find_id as(  
      select distinct parent_id,row_number() over(order by 1) as rw_num
      from table_1
);


declare 
  tot_cnt int := (select count(distinct parent_id) from find_id );
  init_loop int := 1;
  in_init_loop int := 1;
  in_tot_init_loop int;
  v_parent_id int;

Begin
  While init_loop <= tot_cnt    
  Loop
  Raise info 'init_loop = %', Init_loop;  
  Execute 'Select parent_id into ' || v_parent_id  || ' from find_id where rw_num = ' || Init_loop;
  Raise info 'v_patient_id = %', v_patient_id;
  
  Execute 'Select Count(*) into ' || in_tot_init_loop  || ' from Table_1 where Parent_Id = ' || v_parent_id;
  
  While in_init_loop <= in_tot_init_loop
  Loop
  Raise info 'in_init_loop = %', in_init_loop;
  in_init_loop = in_init_loop + 1
  End loop;
  
  init_loop = init_loop + 1;
  end loop;     
  
End; 
End;
$$ language plpgsql;

尝试此操作时出现错误无法执行空查询字符串 我放弃了尝试理解这个错误! :(

【问题讨论】:

【参考方案1】:

这行似乎有问题:

Execute 'Select parent_id into ' || v_parent_id  || ' from find_id where rw_num = ' || Init_loop;

v_parent_id 是空的,所以它会翻译成:

Select parent_id into NULL from find_id where rw_num = 1;

我想你其实是想写的:

SELECT INTO v_parent_id
  parent_id
FROM find_id
WHERE rw_num = Init_loop;

是的,您实际上可以将 SQL 嵌入,而不必将其作为字符串传递给 EXECUTE。看看Structure of PL/pgSQL - Amazon Redshift中的例子。

【讨论】:

以上是关于Redshift 中的嵌套 While 循环的主要内容,如果未能解决你的问题,请参考以下文章

一文了解Python中的循环(for while break continue 嵌套循环...)

理解python中嵌套while循环中的概念的问题

如何计算嵌套在 for 循环中的 while 循环的时间复杂度?

嵌套的while循环只输出一行来选择php中的标签

Python中的嵌套循环

如何忽略错误但不跳过 redshift 复制命令中的行