간단한 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 함수에서 여전히 문자열 보간을 사용할 수 있지만 오류가 발생하기 쉽고 테스트 및 디버그하기가 어렵습니다. 조언이 있으십니까? 나중에 PostgreSQL 8.4
과에서
+1 테이블 스크립트를 게시하는 경우. @dvv는 모두 그렇습니다! – Quassnoi
아마도 이것이 바보 같지만 열이 술어 결과이므로 (각 열 유형이 부울이므로) 뷰를 가질 수 있습니다. 새로운 술어를 추가하는 것은 (1) 새로운 술어로 뷰를 확장하고 (2) 코드를 변경하여 새 컬럼 이름을 선택하는 것입니다. 쿼리 로직을 상당히 단순하게 유지하지만 SQL 내에 술어를 배치합니다. –