単純な SQL クエリを分解できません。私は PostgreSQL を使用していますが、私の質問は他の RDBMS にも関連しています。
次の例を考えてみましょう。テーブル注文があり、合計金額が制限を超えた最初の注文を見つけたいと考えています。
drop table if exists orders cascade;
/**
Table with clients' orders
*/
create table orders(
date timestamp,
amount integer
/**
Other columns omitted
*/
);
/**
Populate with test data
*/
insert into orders(date,amount)
values
('2011-01-01',50),
('2011-01-02',49),
('2011-01-03',2),
('2011-01-04',1000);
/**
Selects first order that caused exceeding of limit
*/
create view first_limit_exceed
as
select min(date) from
(
select o1.date
from orders o1,
orders o2
where o2.date<=o1.date
group by o1.date
having sum(o2.amount) > 100
) limit_exceed;
/**
returns "2011-01-03 00:00:00"
*/
select * from first_limit_exceed;
では、問題を少し難しくしてみましょう。いくつかの述語を満たす行のみの合計金額を見つけたいと考えてください。このような述語がたくさんあり、別のバージョンのビュー first_limit_exceed を作成すると、ひどいコード重複が発生します。したがって、パラメーター化されたビューを作成し、フィルター処理された行のセットまたは述語自体を渡す方法が必要です。Postgres では、クエリ言語関数をパラメーター化されたビューとして使用できます。しかし、Postgres では、関数が行のセットでも別の関数でもない引数として取得することは許可されていません。クライアント側または plpgsql 関数で文字列補間を引き続き使用できますが、エラーが発生しやすく、テストとデバッグが困難です。何かアドバイス?