Spalten verbinden

Hallo,

ich möchte aus den Tabellen “route_0” und “route_1” jeweils die Spalten “latlng” verbinden.
Jedoch jeweils die gerade id aus “route_0” mit der ungeraden id aus “route_1”.

Danke!


SELECT route_0.kunden_id,
'SRID=4326;LINESTRING('||route_0.latlng ||',' || route_1.latlng || ')' AS geo
FROM route_0, route_1;

route_0
id   kunden_id    latlng     
1    109173        18.498592 53.512242
2    109365        19.71010 54.35892
3    108040        13.407711 54.247501
4    108246        11.061338 54.134243

route_1
id   kunden_id    latlng     
1    177397        18.46113 53.512242
2    155187        19.71010 54.35892
3    155287        13.407711 54.247501
4    177996        10.061338 54.134243

Du suchst einen JOIN, und machst auch schon einen, nur leider den falschen. Du hast:

test=*# create table r1 (id int, val int);
CREATE TABLE                              
Time: 1,298 ms
test=*# create table r2 (id int, val int);
CREATE TABLE
Time: 0,870 ms
test=*# copy r1 from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1    1
>> 2    2
>> 3    3
>> \.
Time: 8530,348 ms
test=*# copy r2 from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1    11
>> 2    22
>> 3    33
>> \.

und machst

test=*# select * from r1, r2;
 id | val | id | val
----+-----+----+-----
  1 |   1 |  1 |  11
  1 |   1 |  2 |  22
  1 |   1 |  3 |  33
  2 |   2 |  1 |  11
  2 |   2 |  2 |  22
  2 |   2 |  3 |  33
  3 |   3 |  1 |  11
  3 |   3 |  2 |  22
  3 |   3 |  3 |  33
(9 rows)

Das ist ein Kreuzprodukt, deshalb nennt man diesen Join auch CROSS JOIN:

test=*# select * from r1 cross join r2 ;
 id | val | id | val
----+-----+----+-----
  1 |   1 |  1 |  11
  1 |   1 |  2 |  22
  1 |   1 |  3 |  33
  2 |   2 |  1 |  11
  2 |   2 |  2 |  22
  2 |   2 |  3 |  33
  3 |   3 |  1 |  11
  3 |   3 |  2 |  22
  3 |   3 |  3 |  33
(9 rows)

Du willst aber nur die Datensätze verbinden, wo jeweils id gleich ist, stimmts?

test=*# select * from r1 inner join r2 on (r1.id=r2.id);
 id | val | id | val
----+-----+----+-----
  1 |   1 |  1 |  11
  2 |   2 |  2 |  22
  3 |   3 |  3 |  33
(3 rows)

Was ich nicht so ganz verstehe ist das mit gerader / ungerader ID. Das klingt nach FAIL.

Besorg Dir Literatur zum Thema, und studiere diese!

Du kannst den Join auch so ausführen:

select * from r1 join r2 on (r1.id=r2.id+1);

Allersdings mußt du selbst darauf achten, das immer die Richtigen beiden verbunden werden.
Es IMHO eine sehr schlechte Idee, die Konsistenz der Daten abhängig zu machen von der Position innerhalb Tabelle (das wäre dann ja wie Excel :wink: SCNR). An deiner Stelle würde ich eine Tabelle einführen, die mir die beiden jeweils zu verbindenden Kunden-IDs enthält.
Ich würde dir auch empfehlen etwas über Datenmodellierung und Normalisierung etc. zu lesen. Damit dürften deine Probleme dann vom Tisch sein.

Gruß Uwe