Moin,
ich habe eine Tabelle t1:
id1 | id2 --------- 1 | 1 1 | 2 1 | 3 2 | 1 2 | 4
Ich brauche eine t2:
id1 | id2 --------- 1 | 1 1 | 2 1 | 3 1 | 4 2 | 1 2 | 2 2 | 3 2 | 4
Also: je eine Zeile für alle Werte von id1, id2, also Anzahl(id1) * Anzahl(id2) Zeilen.
Gibt es einen eleganteren Weg, als mittels plpgsql durch die Tabelle zu watscheln und INSERTs zu bilden? Irnkwie hab ich grad einen Denk-Aussetzer...
Ziel ist, falls das interessiert, eine Kreuz-Tabelle. Dazu gibt es im contrib von PostgreSQL eine Funktion, nur brauche ich dazu eine Hilfstabelle in dieser Form.
Andreas
Hallo Andreas,
On Thu, Nov 11, 2004 at 08:27:54PM +0100, Andreas Kretschmer wrote:
Moin,
ich habe eine Tabelle t1:
id1 | id2 [...]
Ich brauche eine t2:
id1 | id2 [...]
Also: je eine Zeile f?r alle Werte von id1, id2, also Anzahl(id1) * Anzahl(id2) Zeilen.
Gibt es einen eleganteren Weg, als mittels plpgsql durch die Tabelle zu watscheln und INSERTs zu bilden? Irnkwie hab ich grad einen Denk-Aussetzer...
Ja.
Ziel ist, falls das interessiert, eine Kreuz-Tabelle. Dazu gibt es im contrib von PostgreSQL eine Funktion, nur brauche ich dazu eine Hilfstabelle in dieser Form.
Brauchst Du nicht, es geht auch mit Sub-Select. Oder View.
insert into t2 (id1,id2) select i1,i2 from (select distinct id1 as i1 from t1) as s1, (select distinct id2 as i2 from t1) as s2;
(schon getestet mit postgresql 7.4.2-4) Der Trick ist der Self-Join ueber die Sub-Queries. Bei vielen Datensaetzen in t1 koennte je ein Index ueber id1 und id2 die Performance verbessern.
Holger
am Thu, dem 11.11.2004, um 21:25:16 +0100 mailte Holger Dietze folgendes:
Hallo Andreas,
Hi, wie geht es Dir?
Gibt es einen eleganteren Weg, als mittels plpgsql durch die Tabelle zu watscheln und INSERTs zu bilden? Irnkwie hab ich grad einen Denk-Aussetzer...
Ja.
Ich ahnte es...
Ziel ist, falls das interessiert, eine Kreuz-Tabelle. Dazu gibt es im contrib von PostgreSQL eine Funktion, nur brauche ich dazu eine Hilfstabelle in dieser Form.
Brauchst Du nicht, es geht auch mit Sub-Select. Oder View.
insert into t2 (id1,id2) select i1,i2 from (select distinct id1 as i1 from t1) as s1, (select distinct id2 as i2 from t1) as s2;
Oh man, sieht sogar einfach aus. In einer NG bekam ich eben auch schon eine Antwort, aber Deine sieht deutlich angenehmer aus.
(schon getestet mit postgresql 7.4.2-4)
test_db=# select version(); version ------------------------------------------------------------------------------------------------------ PostgreSQL 7.4.5 on i386-pc-linux-gnu, compiled by GCC i386-linux-gcc (GCC) 3.3.4 (Debian 1:3.3.4-9)
Der Trick ist der Self-Join ueber die Sub-Queries. Bei vielen Datensaetzen in t1 koennte je ein Index ueber id1 und id2 die Performance verbessern.
Jo, Danke. Mir schwebte ja im Prinzip Deine Lösung vor, nur war ich zu blöd, dies korrekt zu formulieren. Mal sehen, ob ich morgen (sofern ich dazu komme) meine Kreuztabelle hinbekomme. Ich habe N Abteilungen und M Fehlerursachen, Ziel ist eine Tabelle mit M Spalten und N Zeilen und in den Zellen dann die Summe der durch Reklamationen entstandenen Gutschriften. Diese Ergebnistabelle kann ich dann direkt via ODBC dem Controlling ins Excel knallen - fertich.
PS.: SQL ist irnkwie auch was geiles. Man muß es nur können...
Andreas
am 11.11.2004, um 22:16:19 +0100 mailte Andreas Kretschmer folgendes:
Der Trick ist der Self-Join ueber die Sub-Queries. Bei vielen Datensaetzen in t1 koennte je ein Index ueber id1 und id2 die Performance verbessern.
Jo, Danke. Mir schwebte ja im Prinzip Deine Lösung vor, nur war ich zu blöd, dies korrekt zu formulieren. Mal sehen, ob ich morgen (sofern ich dazu komme) meine Kreuztabelle hinbekomme. Ich habe N Abteilungen und M Fehlerursachen, Ziel ist eine Tabelle mit M Spalten und N Zeilen und in den Zellen dann die Summe der durch Reklamationen entstandenen Gutschriften. Diese Ergebnistabelle kann ich dann direkt via ODBC dem Controlling ins Excel knallen - fertich.
Wow!
Ich habe nun eine Kreuztabelle aus 24 Zeilen und 98 Spalten, die aus den Werten einer (okay, noch nicht allzugroßen Tabelle mit 1200 Zeilen) berechnet wird. Geht Klick->fertig. (\timing -> Zeit: 363,863 ms)
Ich hatte sowas ähnliches schonmal mit einer Datentabelle mit ca. 70.000 Zeilen gemacht, aber mit mehreren ineinander verschachtelten Schleifen, die Select's und Update's in rauer Menge produzierten. Laufzeit: ca. 1 Stunde...
PS.: SQL ist irnkwie auch was geiles. Man muß es nur können...
Na, sach ich doch ;-)
Andreas
lug-dd@mailman.schlittermann.de