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

2 Joins -- Datensätze sind doppelt im Ergebniss

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von arnecad, 22 Januar 2015.

  1. arnecad

    arnecad Neuer Benutzer

    Hallo =)
    Ich habe ein Problem mit einer SQL-Abfrage. Es geht um Folgendes:
    (Stark vereinfacht)
    ----------------------------------------------------------------------------------------------
    Vertrag (Tabelle 1) --> Tabelle mit Verträgen
    Vertrags_ID(PS)|Text_ID(FS)|

    Text (Tabelle 2) --> Tabelle mit Texten die in den Verträgen stehen
    Text_ID(PS)|Text

    HardwareVertrag (Tabelle 3) --> Verknüpfung zwischen Hardware und Vertrag
    Hardware_ID(PS)|Vertrags_ID(PS)|HardwareNr.
    ----------------------------------------------------------------------------------------------
    Jetzt möchte ich alle Verträge ausgeben mit zustäzlich dem Text (falls vorhanden) und der HardwareNr (fallsvorhanden). Wenn beides oder eins von beiden nicht vorhanden ist soll er den Vertrag aber trotzdem ausgeben. Also wirklich jeden Vertrag.
    ----------------------------------------------------------------------------------------------
    SELECT
    V.Vertrags_ID, T.Text, HV.HardwareNr
    FROM
    Vertrag as V
    LEFT JOIN
    Text as T ON V.Text_ID = T.Text_ID
    LEFT JOIN
    HardwareVertrag as VT ON V.Vertrags_ID = HV.Vertrags_ID
    ----------------------------------------------------------------------------------------------
    Das war meine Idee. Das Problem ist ich bekomme fast alle Datensätze doppelt und dreifach. Es liegt am zweiten LEFT JOIN, da ich ohne ihn das Problem nicht habe.
    Allerdings weiß ich nicht direkt was ich falsch gemacht habe bzw. was ich ändern müsste.
    Kann mir das einer vielleicht helfen?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ich kann es nicht nachvollziehen.

    Code:
    test=*# create table text (id int primary key);
    CREATE TABLE
    test=*# create table hw (id int primary key);
    CREATE TABLE
    test=*# create table vertrag (id int primary key, text int references text, hw int references hw);
    CREATE TABLE
    test=*# insert into text values (1);
    INSERT 0 1
    test=*# insert into text values (2);
    INSERT 0 1
    test=*# insert into hw values (1);
    INSERT 0 1
    test=*# insert into hw values (2);
    INSERT 0 1
    test=*# insert into vertrag values (1,1,2);
    INSERT 0 1
    test=*# insert into vertrag values (2,2,1);
    INSERT 0 1
    test=*# select * from vertrag v left join text t on v.text=t.id left join hw on v.hw=hw.id;
     id | text | hw | id | id
    ----+------+----+----+----
      1 |  1 |  2 |  1 |  2
      2 |  2 |  1 |  2 |  1
    (2 rows)
    
    Stimmen die Definitionen der Tabellen? Verwendest Du referentielle Integrität?
     
  3. ukulele

    ukulele Datenbank-Guru

    Deine gezeigte Abfrage ist korrekt. Tatsächlich werden vermutlich zu manchen VertragsIDs mehrere HardwareIDs in der Tabelle vorliegen oder mehrmals der gleiche Eintrag existieren. Vergleich mal:
    Code:
    SELECT    count(Vertrags_ID)
    FROM    HardwareVertrag
    
    SELECT    count(DISTINCT Vertrags_ID)
    FROM    HardwareVertrag
     
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