mycroftone
Goto Top

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.

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.

Content-ID: 156082

Url: https://administrator.de/contentid/156082

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

Biber
Biber 30.11.2010 um 18:47:17 Uhr
Goto Top
Moin mycroftone,

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
dog
dog 30.11.2010 um 18:48:25 Uhr
Goto Top
Gehen wir doch einfach rückwärts durch (MySQL-Syntax):
SELECT
	pc.ComputerName,
	pc2.Netzwerk
FROM
	dbo.Computer pc
JOIN
	dbo.ADComputer pc2 ON (pc.ComputerName = pc2.ComputerName)
WHERE
	pc.ComputerID = '45'  
Und in den nächsten rein:
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'  
Und zum Schluss das letzte Subselect raus:
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'  
mycroftone
mycroftone 30.11.2010 um 21:25:04 Uhr
Goto Top
Hallo Biber
ja so in der Art habe ich das von dir schon mal in einem anderen Theard von dir gesehen.
Konnte es aber leider auf meine nicht umsetzen.

Werde ich morgen früh wenn ich Zeit habe gleich mal ausprobieren.

Aber eine Frage habe ich noch. Braucht man unter MS SQL entgegen mySQL kein JOIN im Syntax.
Biber
Biber 30.11.2010 um 22:18:12 Uhr
Goto Top
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. face-wink

Grüße
Biber
mycroftone
mycroftone 03.12.2010 um 18:10:52 Uhr
Goto Top
Hallo Dog

Wunderbar deine Kommandzeile brachte das gewünschte Ergebnis und ich habe es verstanden so das ich noch ein bisschen mehr rauskitzeln konnte.

Besten Dank