SQL SELECT Statement über mehrere Tabellen

exeto

Benutzer
Beiträge
9
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.523
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.

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

exeto

Benutzer
Beiträge
9
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
 

ukulele

Datenbank-Guru
Beiträge
4.644
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
 

exeto

Benutzer
Beiträge
9
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.
 

ukulele

Datenbank-Guru
Beiträge
4.644
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
 
Werbung:

exeto

Benutzer
Beiträge
9
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
 
Oben