SQL SELCT Befehle Verschachteln Verbinden
SELECT Befehle kombinieren / verschachteln / verbinden
Jetzt möchte ich ich einige SELECT Befehle die auf einen MS SQL 2000 Server zugreifen verschachtel / miteinander Verbinden so das ich nur einen SQL Befehl auf einmal habe.
Ich weiß zwar das man mit Join neue Tabelen / View ertellen kann oder mit Klammern Select Befehle ineinander Verschachtel kann aber irgendwie komm ich bei dem Join noch nicht weiter Vorallen weil meine ersten 2 Select Befehle ineinander mit () Verschachtel die jetzt noch mit Join also Pointer auf die Datenbank sowie iuch das Verstanden habe ist mir irgendwie im Moment zu hoch.
Also ich habe 4 Tabellen aus dennen ich Informationen raus holen will.
Für jede habe ich eine Select geschreiben.
Die Informationen aus den ersten beiden Tabellen hole ich mit folgender Abfrage.
Im zweite Select trag ich händisch das Ergebnis zu ComputerID in den Select Befehl ein der wie folgt aussieht.
Im dritten Select trage ich händisch das Ergebniss aus dem Zweiten Select ein.
Jetzt wollte ich alle drei Selects verbinden so das ich keine Daten händisch außer dem Paket im ersten Select eintragen muß.
Also Eingabe 'Titel' im ersten Select
Und Ausgabe zum Schluss Received Computername Netzwerk.
Wer kann mir da helfen.
Jetzt möchte ich ich einige SELECT Befehle die auf einen MS SQL 2000 Server zugreifen verschachtel / miteinander Verbinden so das ich nur einen SQL Befehl auf einmal habe.
Ich weiß zwar das man mit Join neue Tabelen / View ertellen kann oder mit Klammern Select Befehle ineinander Verschachtel kann aber irgendwie komm ich bei dem Join noch nicht weiter Vorallen weil meine ersten 2 Select Befehle ineinander mit () Verschachtel die jetzt noch mit Join also Pointer auf die Datenbank sowie iuch das Verstanden habe ist mir irgendwie im Moment zu hoch.
Also ich habe 4 Tabellen aus dennen ich Informationen raus holen will.
Für jede habe ich eine Select geschreiben.
Die Informationen aus den ersten beiden Tabellen hole ich mit folgender Abfrage.
SELECT
ComputerID,
Received
FROM
dbo.InstallationHistory
WHERE PackageVersionID=( SELECT
PackageVersionID
FROM
dbo.PackageVersion
WHERE Title='Officepaket'
) and Result='success'
Im zweite Select trag ich händisch das Ergebnis zu ComputerID in den Select Befehl ein der wie folgt aussieht.
SELECT
ComputerName,
FROM
dbo.Computer
WHERE ComputerID=‘45’
Im dritten Select trage ich händisch das Ergebniss aus dem Zweiten Select ein.
SELECT
Netzwerk,
FROM
dbo.ADComputer
WHERE ComputerName=‘Verwaltung-Meier’
Jetzt wollte ich alle drei Selects verbinden so das ich keine Daten händisch außer dem Paket im ersten Select eintragen muß.
Also Eingabe 'Titel' im ersten Select
Und Ausgabe zum Schluss Received Computername Netzwerk.
Wer kann mir da helfen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 156082
Url: https://administrator.de/contentid/156082
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
5 Kommentare
Neuester Kommentar
Moin mycroftone,
meinst du so in etwa?
Die Reihenfolge der WHERE-Restriktiktionen sollte natürlich von der Selektivität der Daten ( auf Deutsch: Anzahl der Datensätze; Kardinalität und unterstützende Indizes) abhängen.
Ist bei mir vollkommen willkürlich hingewürfelt.
Die "überflüssige" Spalte PV.Title (=das 'Office-Paket', das du suchst) habe ich im resultSet ergänzt, sonst ist es relativ wertlos nach zwei Tagen.
Grüße
Biber
meinst du so in etwa?
SELECT PV.Title, IH.Received, AD.Computername, AD.Netzwerk
FROM dbo.ADComputer AD, dbo.Computername Compi,
dbo.PackageVersion PV, dbo.InstallationHistory IH
WHERE PV.Title='Officepaket'
AND IH.PackageVersionID = PV.PackageVersionID
AND IH.Result= 'success'
AND Compi.ComputerName = AD.Computername
AND Compi.ComputerID = IH.ComputerID
Die Reihenfolge der WHERE-Restriktiktionen sollte natürlich von der Selektivität der Daten ( auf Deutsch: Anzahl der Datensätze; Kardinalität und unterstützende Indizes) abhängen.
Ist bei mir vollkommen willkürlich hingewürfelt.
Die "überflüssige" Spalte PV.Title (=das 'Office-Paket', das du suchst) habe ich im resultSet ergänzt, sonst ist es relativ wertlos nach zwei Tagen.
Grüße
Biber
Gehen wir doch einfach rückwärts durch (MySQL-Syntax):
Und in den nächsten rein:
Und zum Schluss das letzte Subselect raus:
SELECT
pc.ComputerName,
pc2.Netzwerk
FROM
dbo.Computer pc
JOIN
dbo.ADComputer pc2 ON (pc.ComputerName = pc2.ComputerName)
WHERE
pc.ComputerID = '45'
SELECT
ih.ComputerID,
ih.Received,
pc.ComputerName,
pc2.Netzwerk
FROM
dbo.InstallationHistory ih
JOIN
dbo.Computer pc ON (pc.ComputerID = ih.ComputerID)
JOIN
dbo.ADComputer pc2 ON (pc.ComputerName = pc2.ComputerName)
WHERE
ih.PackageVersionID = (SELECT PackageVersionID FROM dbo.PackageVersion WHERE Title = 'Officepaket') AND
ih.Result = 'success'
SELECT
ih.ComputerID,
ih.Received,
pc.ComputerName,
pc2.Netzwerk
FROM
dbo.InstallationHistory ih
JOIN
dbo.PackageVersion pv ON (pv.PackageVersionID = ih.PackageVersionID)
JOIN
dbo.Computer pc ON (pc.ComputerID = ih.ComputerID)
JOIN
dbo.ADComputer pc2 ON (pc.ComputerName = pc2.ComputerName)
WHERE
pv.PackageVersion = 'Officepaket'
ih.Result = 'success'
Moin mycroftone,
die Schreibweise ist zwar unterschiedlich, aber dog und ich haben beide den gleichen JOIN.
bei mir fehlt dieses Schlüsselwort zwar ganz, aber ein "WHERE tab1.id = tab2.foreignkey.." bedeutet genau dasselbe.
Die Bedingung "Werte müssen GLEICH sein" ist gleichbedeutend mit der Klausel INNER JOIN (Wert mmuss in beiden Tabellen vorhanden UND gleich sein).
Und dogs flapsiges "JOIN ON" ist die Kurzform von INNER JOIN. Alle anderen Formen (LEFT/RIGHT/OUTER/FULL) müssen explizit angegeben werden.
Kannst beides nehmen - bzw nimm das für dich les- und wartbarere.
dogs Variante finde ich offen gesagt nachvollziehbarer und sie sieht eindeutig sortierter aus.
Länger, aber geradliniger.
Grüße
Biber
die Schreibweise ist zwar unterschiedlich, aber dog und ich haben beide den gleichen JOIN.
bei mir fehlt dieses Schlüsselwort zwar ganz, aber ein "WHERE tab1.id = tab2.foreignkey.." bedeutet genau dasselbe.
Die Bedingung "Werte müssen GLEICH sein" ist gleichbedeutend mit der Klausel INNER JOIN (Wert mmuss in beiden Tabellen vorhanden UND gleich sein).
Und dogs flapsiges "JOIN ON" ist die Kurzform von INNER JOIN. Alle anderen Formen (LEFT/RIGHT/OUTER/FULL) müssen explizit angegeben werden.
Kannst beides nehmen - bzw nimm das für dich les- und wartbarere.
dogs Variante finde ich offen gesagt nachvollziehbarer und sie sieht eindeutig sortierter aus.
Länger, aber geradliniger.
Grüße
Biber