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

SQL SELECT Statement über mehrere Tabellen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von exeto, 1 Oktober 2013.

  1. exeto

    exeto Benutzer

    Hallo,

    bis jetzt habe ich eigentlich alle Abfragen selbst hinbekommen.
    Aber momentan scheitere ich an einer Abfrage.

    Ich möchte den Hostnamen, das OS, den RAM und den CPU anzeigen lassen.
    In einer Zeile wird dies denke ich, nicht möglich sein, wenn doch wäre das der hammer.

    Ich habe mal ein Bild erstellt um das deutlicher zu machen, ist als Anhang dabei.

    SQL.jpg

    SQL1 zeigt das Diagram
    SQL2 zeigt meine Abfrage ohne CPU, sondern nur mit dem RAM, dies funktioniert
    SQL3 zeigt die gleiche Abfrage wie SQL2 nur jetzt ist der CPU mit dabei und schon spinnt die Abfrage und der zeigt viel zu viel an, TESTPC1 hat nur einen CPU
    SQL4 schmeißt mir einen Fehler
    SQL5 zeigt mir nichts an
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Prinzipiell ist das kein Ding, wenn die Tabellenstruktur korrekt ist. Ich mag aber jetzt nicht aus Bildern mir die Struktur da zu erforschen.
     
  3. ukulele

    ukulele Datenbank-Guru

    Ja bitte poste mal den Code als Text, ich hab keine Lust alles abzutippen :)
     
  4. exeto

    exeto Benutzer

    Dieser Code zeigt den RAM richtig an, funktioniert:
    Code:
    SELECT dbo.Host.HostName, dbo.System.OS, dbo.RAM.Name
    FROM dbo.Host, dbo.System, dbo.Geraet, dbo.RAM, dbo.Docu
    WHERE Host.HostID = 1
    AND Docu.HostID = Host.HostID
    AND System.DocuID = Docu.DocuID
    AND Geraet.DocuID = Docu.DocuID
    AND Ram.GeraetID = Geraet.GeraetID
    Jetzt will ich ja aber noch die CPU dazu haben und schon funktioniert es nicht mehr mit diesem Code, hier zeigt er viel zu viel an:
    Code:
    SELECT dbo.Host.HostName, dbo.System.OS, dbo.RAM.Name, dbo.CPU.Name
    FROM dbo.Host, dbo.System, dbo.Geraet, dbo.RAM, dbo.Docu, dbo.CPU
    WHERE Host.HostID = 1
    AND Docu.HostID = Host.HostID
    AND System.DocuID = Docu.DocuID
    AND Geraet.DocuID = Docu.DocuID
    AND (Ram.GeraetID = Geraet.GeraetID OR CPU.GeraetID = Geraet.GeraetID)
    Und hier mit INNER JOIN zeigt er mir gar nichts mehr an:
    Code:
    SELECT dbo.Host.HostName, dbo.System.OS, dbo.RAM.Name, dbo.CPU.Name
    FROM dbo.Host
    INNER JOIN Docu ON Docu.HostID = Host.HostID
    INNER JOIN System ON System.DocuID = Docu.DocuID
    INNER JOIN Geraet ON Geraet.DocuID = Docu.DocuID
    INNER JOIN Ram ON Ram.GeraetID = Geraet.GeraetID
    INNER JOIN CPU ON CPU.GeraetID = Geraet.GeraetID
    WHERE Host.HostID = 1
     
  5. ukulele

    ukulele Datenbank-Guru

    Und warum verknüpfst du in deinem 2ten Fall die beiden GeraetID Bedingungen mit OR? Das liefert natürlich ein Kreuzprodukt.
    Code:
    SELECT    dbo.Host.HostName,
            dbo.System.OS,
            dbo.RAM.Name
    FROM    dbo.Host,
            dbo.System,
            dbo.Geraet,
            dbo.RAM,
            dbo.Docu
    WHERE    Host.HostID = 1
    AND        Docu.HostID = Host.HostID
    AND        System.DocuID = Docu.DocuID
    AND        Geraet.DocuID = Docu.DocuID
    AND        Ram.GeraetID = Geraet.GeraetID
    AND        CPU.GeraetID = Geraet.GeraetID
     
  6. exeto

    exeto Benutzer

    Weil "ein" Gerät also eine GeraeteID kann nicht zugleich CPU und RAM sein, sondern nur eins von beiden. Wenn ich das mit AND so mache, gibt mir das Statement nichts aus, weil er ja nach Geräten sucht die CPU und RAM sind.
    Ich habe gedacht mit OR müsste das gehen, dass er mir die Geräte anzeigt die CPU oder RAM sind.

    Die Geraete Tabelle hat auch einen Namen der nicht ganz passt. Eigentlich müsste diese Hardware heißen.
     
  7. ukulele

    ukulele Datenbank-Guru

    Dann könntest du mit LEFT JOIN arbeiten, in etwa so:
    Code:
    SELECT    dbo.Host.HostName,
            dbo.System.OS,
            dbo.RAM.Name,
            dbo.CPU.Name
    FROM    dbo.Host,
            dbo.System,
            dbo.Geraet,
            dbo.Docu
    LEFT JOIN dbo.Ram ON Ram.GeraetID = Geraet.GeraetID
    LEFT JOIN dbo.CPU ON CPU.GeraetID = Geraet.GeraetID
    WHERE    Host.HostID = 1
    AND        Docu.HostID = Host.HostID
    AND        System.DocuID = Docu.DocuID
    AND        Geraet.DocuID = Docu.DocuID
     
  8. exeto

    exeto Benutzer

    Perfekt, danke, mit LEFT JOIN hatte ich noch gar nicht gearbeitet und gar nicht dran gedacht.
    Hätte aber auch bestimmt gereicht wenn de geschrieben hast, probier es mal mit LEFT JOIN, musst ja nicht ganze Arbeit übernehmen :D
     
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