Makeline aus referenzierten Nodes

Hallo,ich habe mir eine OSM-Datenbank importiert (mit osmosis) und würde der Linestrings erzeugen. In der DB sind in der Tabelle ‘ways’ die ‘nodes’ über die ID referenziert die letztendlich den way bilden. Z. B:
Tabelle ways:

id(bigint); nodes(bigint[])
46274796; "{591050823,591050828}";
46276198; "{332143747,332143748}";
46276199; "{332143748,332143024,332142803}";

Tabelle nodes:

id(bigint); geom(geometry)
332142803; "0101000020E6100000FE6D0503BE79134042695EC42D294A40"
332143024; "0101000020E6100000D522A298BC791340D6879A8D3A294A40"
332143748; "0101000020E61000002C56C334C27913409A58857247294A40"

Es gibt noch eine weitere Tabelle ‘way_nodes’ die die einzelnen nodes mit den zugehörigen ways in Verbindung bringt, diese über ich aber gerne aus Zeitgründen übergehen. Momentan nutze ich sie allerdings um die Linestrings zu erzeugen:

UPDATE ways w1 SET linestring = 
(SELECT st_MakeLine(geom)
FROM ( SELECT n.geom, w.id AS wID
	FROM ways w
	JOIN way_nodes wn
	ON w.id=wn.way_id
	JOIN nodes n
	ON wn.node_id=n.id
	ORDER BY wn.sequence_id
	) foo
WHERE w1.id=foo.wid
GROUP BY foo.wid)

Diese Abfrage ist bei der Datenmenge allerdings sehr langsam, da es zwei joins beinhalten, sortieren muss etc. Man könnte, wie gesagt, die way_nodes-Tabelle auslassen, da die ways-Tabelle bereits ein Array mit den notwendigen Referenzen beinhalten. Dessen Reihenfolge müsste aber eingehalten werden. Allerdings ist mir nicht ganz klar wie ich das richtig nutze. Bisherige Versuche sind gescheitert und sahen z. B. so aus:

UPDATE ways w1 SET linestring = 
(SELECT st_MakeLine(geom)
FROM ( SELECT n.geom, w.id AS wID
	FROM ways w
	JOIN nodes n
	ON n.id= ANY(w.nodes)
	) foo
WHERE w1.id=foo.wid
GROUP BY foo.wid)

Hätte jemand nen Vorschlag wie man das möglichst effektiv gewährleisten kann?

Danke.

Edit: Warum fliegen alle meine Umbrüche beim ersten Erstellen aus dem Text hier raus?

So aus dem hohlen Bauch würde ich eine Funktion schreiben, die mir das Array mit den node-ids der Reihe nach durchläuft und daraus eine Linie macht. Ansonsten wäre die richtige Reihenfolge nicht gewährleistet. Essentiell bei der Datenmenge ist natürlich auch eine korrekte Indizierung aller beteiligten Tabellen.

Gruß Uwe

Das wollte ich eigentlich vermeiden, habs aber trotzdem mal gemacht:

CREATE OR REPLACE FUNCTION make_linestrings() 
RETURNS VOID 
AS $$
DECLARE
	currentrow RECORD;
	nds bigint[];
	geos geometry[];
	tmpgeo geometry;
BEGIN

FOR currentrow IN 
	SELECT id,nodes,linestring
	FROM public.ways
LOOP
	 nds= currentrow.nodes;
	 geos=null;
	 FOR i IN array_lower(nds,1) .. array_upper(nds,1) LOOP
		SELECT INTO tmpgeo geom FROM public.nodes WHERE id=nds[i];
		geos = array_append(geos,tmpgeo);	
	 END LOOP;
	 --currentrow.linestring=st_makeline(geos);
	 UPDATE ways SET linestring=st_makeline(geos) WHERE id=currentrow.id;
END LOOP;
END;
$$ LANGUAGE plpgsql;

Gibt es eine Möglichkeit, einen Wert im aktuellen Record zu schreiben (da ich ja eh durch die Tabelle iteriere), oder muss das das zwingen über ein UPDATE laufen? So einfach wie in der auskommentierten Zeile funktioniert es leider nicht.

Du iterierst über das Resultat eines Selects, nicht über die Tabelle. Daher: Nein.

Andreas