2010-11-25 3 views
0

Ich möchte eine Aggregatfunktion (Kosten) einmal für eine Spalte aufrufen und sie über die Self-Left-Joins kaskadieren (um eine Permutation oder eine Kombination von Zeilen zu erstellen). Auf diese Weise stelle ich fest, dass die Kosten O (n) sind, um sie nach den Joins O (Zeile^Joins) aufzurufen. Beginnend mit etwas wie diesem:Aggregatfunktionsspalte mit selbst linkem Join übergeben

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

Ich möchte etwas ähnliches wie unten tun. Ich kann etwas ähnliches mit einer Auswahl in eine temporäre Tabelle tun und aus, dass der Beitritt aber Ich mag ...

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 ... 

Ich würde mit einer temporären Tabelle vermeiden, bevorzugt etwas wie zu tun:

SELECT id, cost(id) as cost FROM plans AS t1 
LEFT JOIN t1 AS t2 
ON t1.id != t2.id 
AND ... 

Um etwas wie diese:

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

Jede Hilfe wäre sehr dankbar.

+0

Was macht die cost() - Funktion? Sie geben ihm keine Eingaben. Wie würde die zweite Kostenspalte berechnet, wenn die Funktion cost() irgendwelche Eingabeparameter hat, die aus den Tabellen kommen? –

+0

Ok, ich habe "ID" gesetzt, damit es auf die Zeile verweisen kann. – Moriarty

+0

Kosten() könnte 1 + 1 Ich muss nur wissen, wie Sie die Spalte durch die linken Joins kaskadieren. Ist es eine Art Unterauswahl? – Moriarty

Antwort

2

Keine Notwendigkeit, die temporäre Tabelle zu erstellen, nur SELECT eine abgeleitete Tabelle machen:

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

oder eine alternative Lösung mit einem gemeinsamen Tabellenausdruck (für PostgreSQL 8.4 und oben)

 
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

Genau das, was ich brauchte! Vielen Dank. – Moriarty

+0

Postgresql scheint diese Syntax nicht zu mögen, aber die Ideen stimmen. – Moriarty

+0

@Moriarty: welche Syntax meinst du? Für die zweite Lösung benötigen Sie mindestens PostgreSQL 8.4. Die erste Lösung sollte mit jeder Version (mindestens> 8.0) funktionieren. –

1

Klingt, als ob Sie window functions verwenden müssen, siehe this Beispiel.

Beispiel:

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

Ich dachte darüber nach, aber ich habe immer noch nicht verstanden, was die eigentliche Frage ist ... –

+0

Ich werde versuchen, dies heute nutzen. – Moriarty

+0

Danke für die Antwort. Ich werde daran arbeiten, die Frage klarzustellen (wie du sehen kannst, kämpfe ich darum, es zu erklären). – Moriarty