"UNION" über Spalten

Hallo,

ich möchte 2 Abfragen miteinander vereinen. Allerdings nicht einfach anfügen wie mit einem UNION, sondern wie eine Art JOIN.

Beispiel: SELECT * FROM a WHERE vonKnoten=1;

vonKnoten (int); nachKnoten (int); verbunden (bool)

1  ;  1        ; t
1  ;  1000     ; t
1  ;  1001     ; t
1  ;  1002     ; t
1  ;  1003     ; t
1  ;  100100   ; f

SELECT * FROM b WHERE nachKnoten=1001;

1        ;  1001  ; t
1000     ;  1001  ; t
1001     ;  1001  ; t
1002     ;  1001  ; f
1003     ;  1001  ; f
100100   ;  1001  ; t

Diese beiden Ergebnisse will ich jetzt folgend in Spalten haben:

  1. SELECT ; 2. SELECT
1  ;  1        ; t      ;     1        ;  1001  ; t
1  ;  1000     ; t      ;     1000     ;  1001  ; t
1  ;  1001     ; t      ;     1001     ;  1001  ; t
1  ;  1002     ; t      ;     1002     ;  1001  ; f
1  ;  1003     ; t      ;     1003     ;  1001  ; f
1  ;  100100   ; f      ;     100100   ;  1001  ; t

Leider finde ich keine Art die beiden Sachen zu JOINEN… ein UNION kommt leider nicht in betracht, da die Daten mit einer Aggregat-Funktion dann bearbeitet werden sollen:

SELECT bool_or(a.verbunden AND b.verbunden) FROM ....

Weiß jemand einen Rat für mich? Eventuell bin ich auch gerade ziemlich blind. :wink: Grund der ganzen Sache ist eigentlich eine Matrix-Multiplikation anhand der boolean-Werte.

Suche auch noch eine gute Anleitung wie ich eine Funktion in C schreibe und dort ein ResultSet übergeben bekomme.

Danke und Grüße!

ich hab zwar jetzt nicht genau verstanden was du meinst, aber was hindert dich daran, folgendes zu tun:

select t1.spalte1, t1.spalte2, t2.spalte1, t2.spalte2
    from tabelle1 t1 
       join tabelle2 t2 on (t1.ident=t2.ident)

Gruß Uwe

Ich habe leider keine Spalte zum joinen dort… Ich wüsste auch nicht in welcher Weise ich dort joinen sollte damit genau das Ergebnis rauskommt. Hab’ schon einiges versucht und es kamen immer zuviele und falsche Zeilen raus.

Suchst Du einen CROSS-Join?

[php]
test=# create schema dummer_join;
CREATE SCHEMA
test=# set search_path= dummer_join;
SET
test=
# create table t1 ( a int, b int);
CREATE TABLE
test=# create table t2 ( c int, d int);
CREATE TABLE
test=
# insert into t1 values (1,2);
INSERT 0 1
test=# insert into t2 values (3,4);
INSERT 0 1
test=
# select t1.a, t1.b, t2.c, t2.d from t1, t2;
a | b | c | d
—±–±–±–
1 | 2 | 3 | 4
(1 row)

test=# insert into t1 values (11,22);
INSERT 0 1
test=
# select t1.a, t1.b, t2.c, t2.d from t1, t2;
a | b | c | d
----±—±–±–
1 | 2 | 3 | 4
11 | 22 | 3 | 4
(2 rows)

test=# insert into t1 values (111,222);
INSERT 0 1
test=
# select t1.a, t1.b, t2.c, t2.d from t1, t2;
a | b | c | d
-----±----±–±–
1 | 2 | 3 | 4
11 | 22 | 3 | 4
111 | 222 | 3 | 4
(3 rows)

test=# insert into t2 values (33,44);
INSERT 0 1
test=
# select t1.a, t1.b, t2.c, t2.d from t1, t2;
a | b | c | d
-----±----±—±—
1 | 2 | 3 | 4
1 | 2 | 33 | 44
11 | 22 | 3 | 4
11 | 22 | 33 | 44
111 | 222 | 3 | 4
111 | 222 | 33 | 44
(6 rows)
[/php]

Achtung, das Result-Set wird sehr schnell sehr groß.


Andreas

Naja, der Cross-Join würde sicherlich das Gesuchte beinhalten. Fragt sich nur, ob das Ding so besonders schnell ist und wie die WHERE für mich da aussehen muss.

Ich hab’ hier mal die Testdaten, die ich für das obere Beispiel benutzt habe.
http://moe.incubo.de/beispiel.sql

Eigentlich will ich immer nur von der einen Tabelle alle mit dem selben vonKnoten und von der anderen Tabelle alle mit dem selben nachKnoten. Und die beiden Sachen direkt nebeneinander - ist immer eine quadratische Matrix. Ich selektiere also immer eine “Zeile” der Matrix aus der einen Tabelle und eine “Spalte” aus der anderen Tabelle.
Es klappt wunderbar mit einem normalen JOIN wenn vonKnoten und nachKnoten die selben sind (also beides z.B. 1). Aber sobald z.B. 1 und 1001 gesucht ist, klappt das natürlich nicht mehr (da falsches JOIN).

Wie gesagt… Sinn des Ganzen ist eine binäre Matrix-Multiplikation.

Danke und Grüße