Redshift 中的嵌套 While 循环
Nested While Loop in Redshift
我的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;
尝试此操作时出现错误无法执行空查询字符串
我放弃了尝试理解这个错误! :(
这一行似乎有问题:
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.
中的示例
我的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;
尝试此操作时出现错误无法执行空查询字符串 我放弃了尝试理解这个错误! :(
这一行似乎有问题:
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.