2010-11-25 10 views
0

집계 함수 (비용)를 한 번 열에 호출하고 자체 왼쪽 조인 (순열 또는 행 조합 생성에 사용)을 통해 캐스케이드하고 싶습니다. 그런 식으로 O (n) 조인 O (행^조인) 후에 비용을 부과하는 비용을 계산합니다. 다음과 같이 시작하고 싶습니다.자기 집계 함수를 전달하는 집계 함수 열

id | cost 
---------- 
1 | 5 
2 | 10 

다음과 비슷한 것을하고 싶습니다. 나는

CREATE TEMP TABLE tmp_750309_plans AS (SELECT *, cost(id) as cost FROM plans WHERE plans.id IN (1,2,...)); 

SELECT * FROM tmp_750309_plans AS t1 LEFT JOIN tmp_750309_plans AS t2 ON ... 

내가 할 선호 ... 내가 임시 테이블을 사용하지 않도록하고 싶습니다 임시 테이블에 그 떨어져 있지만 연결하는 선택과 비슷한 할 수있는 일 같은 :

SELECT id, cost(id) as cost FROM plans AS t1 
LEFT JOIN t1 AS t2 
ON t1.id != t2.id 
AND ... 
어떤 도움을 크게 감상 할 수

id | cost | id | cost | 
----------------------- 
1 | 5 |NULL| NULL | 
2 | 10 |3 | 15 | 

:

이 뭔가를 얻으려면.

+0

cost() 함수는 무엇을하고 있습니까? 당신은 어떤 정보도 제공하지 않습니다. cost() 함수가 테이블에서 오는 입력 매개 변수를 가지고 있다면 두 번째 비용 열은 어떻게 계산됩니까? –

+0

좋아요. 행을 참조 할 수 있도록 "id"를 넣었습니다. – Moriarty

+0

cost()는 1 + 1이 될 수 있습니다. 왼쪽 조인을 통해 열을 계단식으로 배열하는 방법을 알아야합니다. 그것은 일종의 하위 선택입니까? – Moriarty

답변

2

당신의 SELECT 파생 테이블 만들기, 임시 테이블을 만들 필요가 없습니다 :

 
SELECT * 
FROM (
    SELECT *, cost(id) as cost 
    FROM plans 
    WHERE plans.id IN (1,2,...) 
) tmp AS t1 LEFT JOIN tmp AS t2 ON ... 

또는 공통 테이블 식 대체 솔루션을 (PostgreSQL을 8.4 및 위)

 
with tmp as (
    SELECT *, cost(id) as cost 
    FROM plans 
    WHERE plans.id IN (1,2,...) 
) 
SELECT * 
FROM tmp as T1 
    LEFT JOIN tmp AS t2 ON ... 
+0

정확히 내가 필요한 것! 감사. – Moriarty

+0

PostgreSQL은 그 구문을 좋아하지 않지만 아이디어는 옳은 것처럼 보입니다. – Moriarty

+0

@Moriarty : 어떤 구문을 의미합니까? 두 번째 솔루션을 사용하려면 적어도 PostgreSQL 8.4가 필요합니다. 첫 번째 솔루션은 모든 버전 (최소 8.0 이상)에서 작동해야합니다. –

1

window functions을 참조해야합니다. 예를 들어 this을 참조하십시오.

예 :

SELECT id, sum(cost) OVER (ORDER BY cost) FROM t1; 
+0

나는 그것에 대해서도 생각하고 있었지만, 나는 아직도 진짜 질문이 무엇인지 이해하지 못했다 ... –

+0

나는 이것을 오늘 사용하려고 노력할 것이다. – Moriarty

+0

응답 해 주셔서 감사합니다. 질문을 명확히하기 위해 노력할 것입니다 (제가 설명하기 위해 고심하고 있다고 말할 수 있듯이). – Moriarty