select
Postgresの関数をビューとして使用するクエリに変換しようとしています。その理由は、関数のようにパラメーターを使用するのではなく、句を使用したselect
クエリを介してクライアントからアクセスしたいためです。where
このテーブルはツリー(および隣接リスト)を表し、次のように定義されています。
CREATE TABLE tree (
id serial primary key,
parent_id int references tree(id)
);
INSERT INTO tree (id, parent_id) VALUES
(1,null)
, (2,1), (3,2), (4,3), (5,3)
, (6,5), (7,6), (8,4), (9,8)
, (10,9), (11,9), (12,7)
, (13,12), (14,12), (15,11)
, (16,15), (17,16), (18,14)
, (19,13), (20,19), (21,20);
SELECT setval ('tree_id_seq', 21); -- reset sequence
-- This produces a tree like:
-- +-- <10>
-- /
-- +-- <4> -- <8> --- <9> -+- <11> --- <15> --- <16> --- <17>
-- /
-- <1> --- <2> --- <3> -+
-- \
-- +-- <5> --- <6> --- <7> --- <12> -+- <14> --- <18>
-- \
-- \
-- \
-- \
-- +-- <13> --- <19> --- <20> --- <21>
--
ツリー内の任意のノードからルートへのパスを順番に取得するには、次の関数を使用します。
create or replace function _tree(rev int)
returns table(id int, parent_id int, depth int) as $$
declare
sql text;
begin
sql = 'WITH RECURSIVE tree_list(id, parent_id, depth) AS (
SELECT id, parent_id, 1 FROM tree WHERE id = ' || rev ||
'UNION
SELECT p.id, p.parent_id, r.depth + 1
FROM tree p, tree_list r
WHERE p.id = r.parent_id
)
SELECT id, parent_id, depth FROM tree_list order by id;';
return query execute sql;
end;
$$ language plpgsql;
クエリは次のようになりますselect * from _tree(15)
。問題は、この関数をビューに変換して、を呼び出すことができるようにするにはどうすればよいかということselect * from tree where id <= 15
です。また、ビューは関数と同じ速度で実行されますか(つまり、クエリの実行中にwhere句が考慮されますか)?