Paare mit gleichen Attributen finden

weggli1

Benutzer
Beiträge
5
Hallo zusammen

Ich habe ein Problem, es gibt zwar ähnliche hier auf der Seite, aber bis jetzt habe ich noch mit keiner Lösung etwas anfangen können...

Also, folgendes. Ich habe eine Tabelle mit Lieferanten (LieferantID, name) und eine mit Angaben, welcher Lieferant welches Produkt verkauft (LieferantID, ProduktID, Preis).

Nun möchte ich alle Lieferantenpaare auflisten, welche exakt die gleichen Produkte liefern.

Da braucht es ja sowas wie:

SELECT name, name (aber das kommt mir sehr komisch vor und es funktioniert auch nix)

habe auch schon mit JOINs herumexperimentiert, hat aber nichts gebracht.

hat jemand eine Idee?

Vielen Dank schonmal im Voraus
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
Hallo zusammen

Ich habe ein Problem, es gibt zwar ähnliche hier auf der Seite, aber bis jetzt habe ich noch mit keiner Lösung etwas anfangen können...

Also, folgendes. Ich habe eine Tabelle mit Lieferanten (LieferantID, name) und eine mit Angaben, welcher Lieferant welches Produkt verkauft (LieferantID, ProduktID, Preis).

Nun möchte ich alle Lieferantenpaare auflisten, welche exakt die gleichen Produkte liefern.

Da braucht es ja sowas wie:

SELECT name, name (aber das kommt mir sehr komisch vor und es funktioniert auch nix)

habe auch schon mit JOINs herumexperimentiert, hat aber nichts gebracht.

hat jemand eine Idee?

Ja.

Erst einmal interessiert nur die eine Tabelle mit den Verkäufen, andernfalls wäre das eh unvollständig, da keine Tabelle für die Produkte da ist.

Also, mal diese Tabelle:

Code:
test=*# select * from verkauf ;
 lieferant_id | produkt | preis
--------------+---------+-------
            1 |       1 |    10
            2 |       1 |    11
            2 |       2 |    22
            3 |       2 |    21
            1 |       3 |    31
            4 |       3 |    33
(6 rows)

Da sind es IMMER NUR 2 Anbieter für dasselbe Produkt.

Code:
test=*# select distinct on (greatest(a.lieferant_id,b.lieferant_id)) a.lieferant_id, b.lieferant_id, a.produkt, a.preis as a_preis, b.preis as b_preis from verkauf a inner join verkauf b on a.produkt=b.produkt and a.lieferant_id!=b.lieferant_id;
 lieferant_id | lieferant_id | produkt | a_preis | b_preis
--------------+--------------+---------+---------+---------
            1 |            2 |       1 |      10 |      11
            2 |            3 |       2 |      22 |      21
            1 |            4 |       3 |      31 |      33
(3 rows)

Das geht aber nicht mehr bei 3 oder mehr Anbietern je Produkt.

Code:
test=# insert into verkauf values (2,3,32);
INSERT 0 1
test=*# commit;
COMMIT
test=# select distinct on (greatest(a.lieferant_id,b.lieferant_id)) a.lieferant_id, b.lieferant_id, a.produkt, a.preis as a_preis, b.preis as b_preis from verkauf a inner join verkauf b on a.produkt=b.produkt and a.lieferant_id!=b.lieferant_id;
 lieferant_id | lieferant_id | produkt | a_preis | b_preis
--------------+--------------+---------+---------+---------
            1 |            2 |       1 |      10 |      11
            2 |            3 |       2 |      22 |      21
            1 |            4 |       3 |      31 |      33
(3 rows)

Du siehst den Fehler?


Da müssen wir nun tricksen ;-)

Code:
test=*# select distinct on (greatest(a.lieferant_id,b.lieferant_id), least(a.lieferant_id,b.lieferant_id)) a.lieferant_id, b.lieferant_id, a.produkt, a.preis as a_preis, b.preis as b_preis from verkauf a inner join verkauf b on a.produkt=b.produkt and a.lieferant_id!=b.lieferant_id;
 lieferant_id | lieferant_id | produkt | a_preis | b_preis
--------------+--------------+---------+---------+---------
            1 |            2 |       1 |      10 |      11
            2 |            3 |       2 |      22 |      21
            1 |            4 |       3 |      31 |      33
            2 |            4 |       3 |      32 |      33
(4 rows)


Natürlich wird das immer größer, wenn noch mehr Lieferanten den selben Krempel haben:

Code:
test=*# insert into verkauf values (5,3,35);
INSERT 0 1
test=*# select distinct on (greatest(a.lieferant_id,b.lieferant_id), least(a.lieferant_id,b.lieferant_id)) a.lieferant_id, b.lieferant_id, a.produkt, a.preis as a_preis, b.preis as b_preis from verkauf a inner join verkauf b on a.produkt=b.produkt and a.lieferant_id!=b.lieferant_id;
 lieferant_id | lieferant_id | produkt | a_preis | b_preis
--------------+--------------+---------+---------+---------
            2 |            1 |       3 |      32 |      31
            2 |            3 |       2 |      22 |      21
            4 |            1 |       3 |      33 |      31
            4 |            2 |       3 |      33 |      32
            1 |            5 |       3 |      31 |      35
            5 |            2 |       3 |      35 |      32
            5 |            4 |       3 |      35 |      33
(7 rows)
 
Werbung:

weggli1

Benutzer
Beiträge
5
Vielen Dank, das wird ja echt kompliziert, da wäre ich nie draufgekommen.
Dankeschön auch für die wunderbare Darstellung, so kann man das so leicht nachvollziehen.
Liebe Grüsse
 
Oben