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

SQL-Abfrage Datensätze vervielfältigen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Talki, 25 April 2017.

  1. Talki

    Talki Neuer Benutzer

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

    drdimitri Datenbank-Guru

    Hmm vielleicht ins Kreuzprodukt folgende Bedingung einbauen: kunden-nr<>von_kunden_nr
     
    Talki gefällt das.
  3. NeoPrince

    NeoPrince Aktiver Benutzer

    select * from
    TABELLENNAME as t1
    join TABELLENNAME as t2 on t1.id!=t2.id
     
    Talki gefällt das.
  4. Talki

    Talki Neuer Benutzer

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

    Vielen Dank für die schnelle Unterstützung ...
     
  5. akretschmer

    akretschmer Datenbank-Guru

    ... 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=*#
    
     
  6. Talki

    Talki Neuer Benutzer

    Guter Einwand ;-)

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

     
  7. ukulele

    ukulele Datenbank-Guru

    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
     
    Talki gefällt das.
  8. Talki

    Talki Neuer Benutzer

    Einen CROSS JOIN kannte ich noch gar nicht :-(

    Werde ich gleich mal testen ;-)

    Danke für die Info

     
  9. akretschmer

    akretschmer Datenbank-Guru

    den macht man meist unabsichtlich - und wundert sich danach nur über den Trümmerhaufen.
     
    Talki gefällt das.
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