2 Joins -- Datensätze sind doppelt im Ergebniss

arnecad

Neuer Benutzer
Beiträge
1
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?
 
Werbung:
Allerdings weiß ich nicht direkt was ich falsch gemacht habe bzw. was ich ändern müsste.
Kann mir das einer vielleicht helfen?

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?
 
Werbung:
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
 
Zurück
Oben