2010-11-25 22 views
0

集計関数(コスト)を列に1回呼び出して、セルフルール結合(順列または行の組み合わせを作成するために使用)をカスケードしたいとします。そのようにして、コストはO(n)行の結合後に呼び出すことができます。自己集約関数集約関数列を渡す

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()関数にテーブルからの入力パラメータがある場合、2番目のコスト列はどのように計算されますか? –

+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:どの構文を意味しますか? 2番目の解決策では、少なくともPostgreSQL 8.4が必要です。最初のソリューションは、任意のバージョン(少なくとも> 8.0)で動作する必要があります。 –

1

window functionsを参照する必要があります。thisを参照してください。

例:

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

私はそれについても考えていましたが、私はまだ本当の質問が何であるか理解していませんでした。 –

+0

私は今日これを利用しようとします。 – Moriarty

+0

お返事ありがとうございます。質問を明確にすることに取り組んでいきます(私がそれを説明するのに苦労していると言うことができます)。 – Moriarty