我無法分解簡單的SQL查詢。我使用PostgreSQL,但我的問題也與其他RDBMS有關。PostgreSQL查詢分解
考慮下面的例子。我們有臺訂單,我們想找到第一個訂單後,其總金額超出了一些限制:
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函數中使用字符串插值,但它很容易出錯並且很難測試和調試。 有什麼建議嗎?
用於發佈表格腳本。所有這些都是@dvv做的! – Quassnoi
也許這是愚蠢的,但你可以有一個視圖的列是謂詞的結果(所以每列類型是布爾值)。那麼添加一個新的謂詞將涉及:(1)用新的謂詞擴展視圖;(2)更改代碼以在新列名上選擇。這使查詢邏輯非常簡單,但將謂詞放在sql中。 –