SQL-Abfrage Datensätze vervielfältigen

Talki

Neuer Benutzer
Beiträge
4
Hallo zusammen

Ich bin hier neu, und hoffe das der Titel meines Themas nicht zu unverständlich ist.

Ich möchte eine Tabelle mit sich selbst joinen, was grundsätzlich nicht das Problem ist.
Ich versuche das mal zu erklären ...

Folgende Beispieltabelle
quelle.jpg

Das Ergebnis soll so aussehen wie hier
ergebnis.jpg

Es sollen also de maximalen Kombinationen erstellt werden ...
Nur kein Kunde mit sich selbst.

Mit funktionen oder Prozeduren ist das ja keine Hexerei, aber als SELECT bekomme ich das nicht wirklich hin.

Ich hoffe es hat jemand eine zündende Idee ;-)

Vielen Dank im Voraus

Talki
 
Werbung:
Funktioniert ...
Man darf eben nur keinen LEFT JOIN machen ... so wie ich das hatte ;-)

Vielen Dank für die schnelle Unterstützung ...
 
Man darf eben nur keinen LEFT JOIN machen ...

... oder es halt richtig mit einem LEFT JOIN machen:

Code:
test=*# create table talki (kundennummer int, kundenname text);
CREATE TABLE
test=*# insert into talki select s, 'Kunde ' || s::text from generate_series(1, 5) s;
INSERT 0 5
test=*# select * from talki ;
 kundennummer | kundenname
--------------+------------
  1 | Kunde 1
  2 | Kunde 2
  3 | Kunde 3
  4 | Kunde 4
  5 | Kunde 5
(5 Zeilen)
test=*# select * from talki left join (select * from talki) x on talki.kundennummer != x.kundennummer;
 kundennummer | kundenname | kundennummer | kundenname
--------------+------------+--------------+------------
  1 | Kunde 1  |  2 | Kunde 2
  1 | Kunde 1  |  3 | Kunde 3
  1 | Kunde 1  |  4 | Kunde 4
  1 | Kunde 1  |  5 | Kunde 5
  2 | Kunde 2  |  1 | Kunde 1
  2 | Kunde 2  |  3 | Kunde 3
  2 | Kunde 2  |  4 | Kunde 4
  2 | Kunde 2  |  5 | Kunde 5
  3 | Kunde 3  |  1 | Kunde 1
  3 | Kunde 3  |  2 | Kunde 2
  3 | Kunde 3  |  4 | Kunde 4
  3 | Kunde 3  |  5 | Kunde 5
  4 | Kunde 4  |  1 | Kunde 1
  4 | Kunde 4  |  2 | Kunde 2
  4 | Kunde 4  |  3 | Kunde 3
  4 | Kunde 4  |  5 | Kunde 5
  5 | Kunde 5  |  1 | Kunde 1
  5 | Kunde 5  |  2 | Kunde 2
  5 | Kunde 5  |  3 | Kunde 3
  5 | Kunde 5  |  4 | Kunde 4
(20 Zeilen)

test=*#
 
Guter Einwand ;-)

Super ... Danke für den Nachtrag ...

... oder es halt richtig mit einem LEFT JOIN machen:

Code:
test=*# create table talki (kundennummer int, kundenname text);
CREATE TABLE
test=*# insert into talki select s, 'Kunde ' || s::text from generate_series(1, 5) s;
INSERT 0 5
test=*# select * from talki ;
kundennummer | kundenname
--------------+------------
  1 | Kunde 1
  2 | Kunde 2
  3 | Kunde 3
  4 | Kunde 4
  5 | Kunde 5
(5 Zeilen)
test=*# select * from talki left join (select * from talki) x on talki.kundennummer != x.kundennummer;
kundennummer | kundenname | kundennummer | kundenname
--------------+------------+--------------+------------
  1 | Kunde 1  |  2 | Kunde 2
  1 | Kunde 1  |  3 | Kunde 3
  1 | Kunde 1  |  4 | Kunde 4
  1 | Kunde 1  |  5 | Kunde 5
  2 | Kunde 2  |  1 | Kunde 1
  2 | Kunde 2  |  3 | Kunde 3
  2 | Kunde 2  |  4 | Kunde 4
  2 | Kunde 2  |  5 | Kunde 5
  3 | Kunde 3  |  1 | Kunde 1
  3 | Kunde 3  |  2 | Kunde 2
  3 | Kunde 3  |  4 | Kunde 4
  3 | Kunde 3  |  5 | Kunde 5
  4 | Kunde 4  |  1 | Kunde 1
  4 | Kunde 4  |  2 | Kunde 2
  4 | Kunde 4  |  3 | Kunde 3
  4 | Kunde 4  |  5 | Kunde 5
  5 | Kunde 5  |  1 | Kunde 1
  5 | Kunde 5  |  2 | Kunde 2
  5 | Kunde 5  |  3 | Kunde 3
  5 | Kunde 5  |  4 | Kunde 4
(20 Zeilen)

test=*#
 
Oder, weil wir ja alle auf besonders exakte Join-Syntax abfahren, ein CROSS JOIN. Denn das ist es ja eigentlich, ein Join ohne Bedingung. Den Selbstbezug würde ich in der WHERE-Condition raus nehmen.
Code:
SELECT * FROM t1 CROSS JOIN t2 WHERE t1.id != t2.id
 
Einen CROSS JOIN kannte ich noch gar nicht :-(

Werde ich gleich mal testen ;-)

Danke für die Info

Oder, weil wir ja alle auf besonders exakte Join-Syntax abfahren, ein CROSS JOIN. Denn das ist es ja eigentlich, ein Join ohne Bedingung. Den Selbstbezug würde ich in der WHERE-Condition raus nehmen.
Code:
SELECT * FROM t1 CROSS JOIN t2 WHERE t1.id != t2.id
 
Werbung:
Zurück
Oben