我想第一次尝试使用递归CTE,所以我写了一个查询,根据根音和给出不同比例的步骤来显示音阶中的音符。
当运行脚本本身一切都很好,但是第二次尝试将其变成函数时,我得到错误“relation”temp_scale_steps“不存在”。
我正在使用postgreSQL 9.4.1。我看不出为什么这不起作用的任何理由。感谢任何建议。
以下代码:
create or replace function scale_notes(note_id int, scale_id int)
returns table(ordinal int, note varchar(2))
as
$BODY$
drop table if exists temp_min_note_seq;
create temp table temp_min_note_seq
as
select min(note_seq_id) as min_note_id from note_seq where note_id = $1
;
drop table if exists temp_scale_steps;
create temp table temp_scale_steps
as
with recursive steps (ordinal, step) as
(
select ordinal
,step
from scale_steps
where scale_id = $2
union all
select ordinal+1
,step
from steps
where ordinal < (select max(ordinal) from scale_steps where scale_id = $2)
)
select ordinal
,sum(step) as temp_note_seq_id
from steps
group by 1
order by 1
;
select x.ordinal
,n.note
from
(
select ordinal
,min_note_id + temp_note_seq_id as temp_note_seq_id
from temp_scale_steps
join temp_min_note_seq on (1=1)
) x
join note_seq ns on (x.temp_note_seq_id = ns.note_seq_id)
join notes n on (ns.note_id = n.note_id)
order by ordinal;
$BODY$
language sql volatile;
在回复评论时,我更改了脚本,以便一步完成查询,现在一切正常。但是,我仍然有兴趣知道为什么上面的版本不起作用。