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

Problem mit Joins

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von script1, 3 September 2012.

  1. script1

    script1 Benutzer

    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ß
     
  2. ukulele

    ukulele Datenbank-Guru

    Ich würde annehmen das die Daten auch tatsächlich doppelt vorhanden sind, schonmal geprüft?
     
  3. script1

    script1 Benutzer

    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.)
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
  5. Tommi

    Tommi Datenbank-Guru

    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
     
  6. ukulele

    ukulele Datenbank-Guru

    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 
     
  7. script1

    script1 Benutzer

    Habs hin bekommen :) Danke euch! :)
     
  8. Tommi

    Tommi Datenbank-Guru

    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
     
  9. script1

    script1 Benutzer

    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ß
     
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