Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Paare mit gleichen Attributen finden

Dieses Thema im Forum "PostgreSQL" wurde erstellt von weggli1, 13 März 2013.

  1. weggli1

    weggli1 Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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)
    
     
    weggli1 gefällt das.
  3. weggli1

    weggli1 Benutzer

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden