Verschachtelte SQL Abfrage - SQL Syntax

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Jojo0405.

    Verschachtelte SQL Abfrage - SQL Syntax

    Hallo Leute,

    ich habe 3 DB- Tabellen die wie folgt aufgebaut sind:

    DIRECTORS
    ID (PK)
    NAME

    MOVIES
    ID (PK)
    TITLE

    MOVIE_DIRECTOR
    ID
    ID_MOVIE (FK)
    ID_DIRECTOR (FK)
    MOVIE_TITLE
    DIRECTOR_NAME

    Jetzt möchte ich in einer SQL Abfrage alle DIRECTORS ermitteln, die
    Nicht in MOVIE_DIRECTOR enthalten sind und deren Name z. B. F enthält
    Bei dem folgenden Statement bin ich mir sicher, dass der Datensatz nicht in MOVIE_DIRECTOR vorhanden ist also sollten alle Datensätze aus DIRECTORS ausgegeben werden

    SELECT DISTINCT NAME FROM DIRECTORS RIGHT JOIN MOVIE_DIRECTOR ON DIRECTORS.NAME!=MOVIE_DIRECTOR.DIRECTOR_NAME WHERE MOVIE_DIRECTOR.MOVIE_TITLE='16 Blocks' AND NAME LIKE '%T%' ORDER BY NAME

    Allerdings bekomme ich gar keine Ergebnisse ?(

    des weiteren ist die SQL Abfrage mit sehr vielen Datensätzen sehr sehr langsam, hat jemand eine Idee wie ich das optimieren kann?
    probierma sowas wie

    SQL-Abfrage

    1. SELECT NAME FROM DIRECTORS Left JOIN MOVIE_DIRECTOR ON DIRECTORS.ID=MOVIE_DIRECTOR.DirectorID WHERE MOVIE_DIRECTOR.ID_MOVIE = null
    also einen LeftJoin, aus dem die Datensätze ausgewählt werden, die nix verjoinen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Mal eine Frage: Warum hast Du in der dritten Tabelle nochmal MOVIE_TITLE und DIRECTOR_NAME? Die Angaben stehen doch auch in den jeweiligen Detailtabellen? Würde das nicht heißen, das Du TITLE und NAME jeweils doppelt pflegen müsstest?

    Das wäre immerhin eine immer wieder "gern" gesehene Fehlerquelle. Stichwort Redundanz und Normalisierung.
    @wertherchen
    Okay, da haben Sie recht - ich hatte das noch zur Übersichtlichkeit drin, um direkt in der DB besser überprüfen zu können.
    Nach dem ich die Abfrage aber angepasst habe, ist das Ergebnis noch das gleiche ...

    @ErfinderDesRades
    Wenn ich die Abfrage ausführe, kommt nichts raus.
    Es war auch nicht als fertige Lösung gedacht. Wichtiger ist die ERklärung: Versuch einen LeftJoin zu basteln, und von dem selektierste nur die Datensätze, die nix joinen.

    Ich bin auch ühaupt nicht gut in Sql, insbesondere weiß garnicht, wie man beim LeftJoin die nix-joinenden Datensätze identifiziert.
    Ich weiß nur, wie eine normale Left Join-Tabelle aussieht, und da gibts halt Datensätze mit so typischen leeren Feldern, und genau die halt selektieren.

    Ich hoffe auch, dass sich der eine oder annere Sql-Crack noch meldet, um hier bisserl kompetenter weiterzuhelfen.
    Das Ding ist ja, dass wenn ich nach meiner Lösung das ganze mache und min. einen Datensatz zu dem Film habe, alle restlichen Directors vorgeschlagen werden.
    Bloß wenn nichts enthalten ist, kommt kein Ergebnis
    Das SQL-Command von @ErfinderDesRades ist korrekt. Auf diese Art und Weise lassen sich Datensätze herausfiltern die zwar in der Haupttabelle (from Tabelle) vorhanden sind, jedoch in der gejointen (Left Join Tabelle2) nicht. Wichtig ist bei solchen Abfragen, auf Spalten zu zielen welche keine Null Werte erlauben, ad es sonst passieren kann, dass es in der gejointen Tabelle schon einen Datensatz gibt, aber das Feld ist halt blöderweise Null (weil es halt möglich ist). Am Besten verwendet man die PrimaryKey Spalte (Where Tabelle2.ID is null).

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Also wenn ich die oben gennant SQL Abfrage ausfüghre kommt einfach nichts aus.
    Ersetze ich das =Null durch ein "is Null" kommt nur die Datensätze raus bei denen die ID_Director NULL ist.
    Es gibt tatsächlich mehrere Directors ^^
    Aber das gleiche Procedere verwende ich auch bei Actors und Genres von daher ^^..

    Das ID_MOVIE Feld wie das ID_DIRECTOR Feld ist Integer


    Mal eine andere Frage:
    Wie wäre das ganze denn anzupassen, wenn Datensätze vorhanden sind?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Jojo0405“ ()