Problem mit Joins

script1

Benutzer
Beiträge
7
Moin habe mal eine Frage bzw. ein kleines Problem. Ich habe drei Tabellen aus denen ich Daten auslesen möchte.

Tabelle1 : Produkt (mit passenden ID's und namen)
Tabelle2: Lizenzen (Produkt ID's, anz. der Lizenzen)
Tabelle3: Abteilung (Produkt ID's, Abteilungs ID's)

Meine Abfrage ist wie folgt:
Code:
Select Product.name, Lizenz.Licensed
From Product
INNER JOIN Lizenz ON (Product.id=Lizenz.ProductId) INNER JOIN Abteilung ON (Product.id=Abteilung.ProductId)
WHERE Abteilung.id=2

Das Problem ist nur, dass er mir die Daten zwar anzeigt aber doppelt :(

Kann mir da wer weiterhelfen?

Gruß
 
Werbung:
Ja die Daten (bzw. die Produkt ID) ist in der Tabelle3 (Abteilung) teilweise doppelt vorhanden allerdings nicht mit den selben Abteilungs IDs (z.B. hat die Abteilung "einkauf" die ID 2, "vertrieb" die ID 1. Ein Produkt kann natürlich einmal in der Abteilung "Einkauf" als auch in der Abteilung "Vertrieb" eingesetzt werden. Es sollen halt nur die Produkte angezeigt werden, die z.B. im "Einkauf" eingesetzt werden.)
 
Nunja, da du Abteilung.id = 2 als Bedinung hast werden die anderen Daten auch nicht ausgegeben. Probier mal das hier:
Code:
SELECT    p.name,
        l.Licensed
FROM    Product p,
        Lizenz l,
        Abteilung a
WHERE    p.id = l.ProductId
AND        p.id = a.ProductId
AND        a.id = 2

Sollte das immernoch doppelte Einträge liefern sind auch wirklich doppelte Einträge mit a.id = 2 vorhanden.
 
Hallo script1,

dann geb ich jetzt auch noch meinen Senf dazu, auch wenns eigentlich schon gelöst ist.

wichtig ist, dass eine Redundanz der Daten auszuschließen ist.
Wenn in der Abfrage doppelte Einträge auftauchen, die aufgrund einer Abhängigkeit eintstehen, muss diese Abhängigkeit natürlich so behandelt werden, dass diese ausgefiltert wird.
Der Lösungsansatz von ukulele ist also vollkommen korrekt.

Als Lösung mit Join Syntax würde das ganze dann so aussehen:

SELECT p.name, l.licensed
FROM Product p
INNER JOIN Lizenz l
ON l.ProductID=p.id
INNER JOIN Abteilung a
ON a.ProductID=p.id
WHERE a.id=2

Hier könnte aufgrund der genutzten Joins die WHERE-Klausel auch als UND-Verknüpfung in den INNER JOIN auf die Tabelle Abteilung einfließen,
mit WHERE-Klausel ist es aber eher Standard.

Vorteil dieser Syntax ist es, dass je nach Anforderung der Abfrage diese sehr schnell umgestellt werden kann.
Möchte man nämlich z.B. alle lizensierten Produkte sehen, auch die, die nicht von der Abteilung genutzt werden, kann statt des INNER JOIN dann ganz einfach ein LEFT OUTER JOIN benutzt werden.
Möchte man z.B. alle Produkte in einer Abteilung sehen, auch die nicht lizensierten, verlegt man den Join (mit Verknüpfungen) auf die Tabelle Lizenz ganz nach hinten und benutzt hier ebenfalls einen LEFT OUTER JOIN.


Viele Grüße,
Tommi
 
Die JOIN Syntax kam ja schon zum Einsatz, ich bin mir hier auch nicht ganz sicher, wo das Problem der doppelten Einträge liegt. Mit dem ursprünglichen Statement + alle übrigen Spalten sollte man mindestens in einer Spalte bei jedem Datensatz einen Unterschied finden, auch wenn eventuell Name und Lizenz doppelt ausgegeben werden.
Code:
Select Product.name,
Lizenz.Licensed,Product.*,Lizenz.*,Abteilung.*
From Product
INNER JOIN Lizenz ON (Product.id=Lizenz.ProductId) INNER JOIN Abteilung ON (Product.id=Abteilung.ProductId)
WHERE Abteilung.id=2
 
Hallo script1,

so rein interessahalber würde mich ja dann doch interessieren, woran es denn jetzt lag (bin da manchmal was neugiereig :) ).
Denn eigentlich arbeiten die beiden SQL-Abfrage-Varianten , die in diesem Thread angegeben sind, genau gleich.

@ukulele: ups, hab mich so auf Deine Antwort konzentriert, dass ich die Ursprungsabfrage gar nicht mehr betrachtet hab <sichvordiestirnhaut> Das ist, wenn man vor dem ersten Kaffe versucht, Fragen zu beantworten.

Grüße,
Tommi
 
Werbung:
Also habe es dann mit der Abfrage von ukulele noch einmal probiert und dann lief das ganze auch..hatte wohl iwo einen kleinen Fehler drin ;) Vielen Dank nochmal für eure Hilfe :)

Gruß
 
Zurück
Oben