SQL Ergebnisse aus zwei Tabellen zusammenführen

Die wilde Inge

Lt. Commander
Registriert
Aug. 2009
Beiträge
2.044
Grüße,

ich hätte da mal eine Frage. Ich komme mit den Anleitungen die ich bisher gefunden habe nicht weiter und bin ehrlich gesagt auch kein Datenbank Genie.

Vielleicht kann mir ja jemand helfen.

Ich habe also zwei Tabellen in meiner DB und ich hätte gerne alle Geräte, die entweder in der einen Tabelle oder der anderen drin sind. Es kann vorkommen, dass Geräte nur in der einen oder der anderen auftauchen, das spielt für mich aber keine Rolle. Ich will sie alle 🙃

Hiermit kriege ich die Geräte die ich suche, aus der einen Tabelle:

SELECT DISTINCT Devices.DeviceName FROM Devices LEFT OUTER JOIN InventoryIntegrationData InventoryUpdate ON Devices.DeviceID=InventoryUpdate.DeviceID WHERE ( ((InventoryUpdate.InventoryType LIKE N'%SecurityInventory%') OR (InventoryUpdate.InventoryType LIKE N'%SecurityProductsManagement%')) AND (Devices.TopologyType LIKE N'%DB_DEVTYPE_CLIENT%') ) ORDER BY Devices.DeviceName ASC

und hiermit die zweite Gruppe:

SELECT DISTINCT CRuleDeviceAssignments.Score FROM CRuleDeviceAssignments WHERE ( (CRuleDeviceAssignments.Score IS NOT NULL) ) ORDER BY CRuleDeviceAssignments.Score ASC

Wie kriege ich jetzt ein Merge hin zwischen beiden Ergebnismengen?

Ich bin kurz vorm Verzweifeln :heul:
 
hmm, wie wäre es mit UNION und dann die die in beiden drin sind wieder rauswerfen?
 
Vllt habe ich das auch missverständlich ausgedrückt. Ich will schon alle Geräte haben, es muss nichts rausgeworfen werden. Es kann eben sein, dass ein Gerät NUR in einer der beiden Gruppen auftaucht, statt in beiden, aber als Ergebnis will ich dann eben auch dieses Gerät.
Ein reiner Merge würde mich schon reichen. Es ist nicht erforderlich nur die rauszusuchen, die in beiden oder nur einem sind.

Dankeeeee
 
Ansatz für Faule:
Temporäre Tabelle[1] erstellen, die gewünschten Werte deiner beiden Tabellen via Insert reinwerfen und dann SELECT Distinct aus der temp Tabelle rausziehen was du magst.


[1] Viele Datenbanksysteme bieten die Möglichkeit temp Tables nur um Ram zu halten, für eben solche Zwecke.
 
Piktogramm schrieb:
Temporäre Tabelle[1] erstellen, die gewünschten Werte deiner beiden Tabellen via Insert reinwerfen und dann SELECT Distinct aus der temp Tabelle rausziehen was du magst.
Am besten noch einen Cursor verwenden :D Das würde auch mit UNION und Distinct oder Group By gehen.
 
Ich habs hinbekommen, glaube ich :-D

SELECT DISTINCT Devices.DeviceName
FROM Devices

INNER JOIN InventoryIntegrationData InventoryUpdate
ON Devices.DeviceID=InventoryUpdate.DeviceID

INNER JOIN CRuleDeviceAssignments
ON CRuleDeviceAssignments.DeviceID=Devices.DeviceID

WHERE (( (InventoryUpdate.InventoryType LIKE N'%SecurityInventory%') OR (InventoryUpdate.InventoryType LIKE N'%SecurityProductsManagement%')) AND (Devices.TopologyType LIKE N'%DB_DEVTYPE_CLIENT%') OR (CRuleDeviceAssignments.Score IS NOT NULL) ) ORDER BY Devices.DeviceName ASC
 
Ein Inner Join (Schnittmenge) macht doch was anderes wie 2 Tabellenergebnisse zusammen zu schmeißen...

Bist du dir sicher das dass funktioniert? Ich glaube eher nicht. Arbeite mal mit LEFT oder RIGHT JOIN.
Oder was noch übersichtlicher und verständlicher ist mit dem oben vorgeschlagenen UNION.
 
Ähm.

Deine Antwort hat mich jetzt stutzig gemacht, aber ich glaube ich weiß wieso es trotzdem geht (tuts nämlich).

Ich mache ja eine Schnittmenge zwischen A und B und A und C und nicht zwischen B und C - wäre meine Erklärung. In dem Fall stimmts dann nämlich, alle Geräte die in A und B drin ODER die in A und C drin sind.

Ich hab heute total viel gelernt, mega :-D
 
Es wird dennoch alles in einer Anweisung behandelt warum er die Schnittmenge aus allen 3 bilden müsste.

798493


Kann natürlich an deiner DB liegen, manche sind teilweise kurios.

Fiddle-Link: http://www.sqlfiddle.com/#!9/c56438/1
 
D.h. er dürfte mir nur die Geräte anzeigen die in A, B und C gleichzeitig drin stehen?
Das macht er auf jeden Fall nicht, dann würde das mit dem Rausschmeißen nicht so on the fly funktionieren.
Wer weiß, Haptsache es klappt.
Dank dir!
 
Die wilde Inge schrieb:
D.h. er dürfte mir nur die Geräte anzeigen die in A, B und C gleichzeitig drin stehen?
Jupp, siehe Bsp. oben.
Die wilde Inge schrieb:
Wer weiß, Haptsache es klappt.
:) Welche DB hängt den dahinter?

Sauber wäre wie gesagt ein Left/Right Join bzw. bei deiner Riesenbedingung für die eine Selektion ein Union.
 
Äääh. Postgres
Ich gucke mir noch mal an wie das mit Union funzt. Aber erst morgen. Feierabend!
 
Fehlt dir bei deiner zweiten AND Verknüpfung nicht eine Klammer um den OR Part?

Ansonsten hat @Testa2014 recht, wenn du die Joins nicht klammerst implizierst Du Schnittmengen.
 
Das ist korrekt, ich habe das hier dann aber nicht mehr korrigiert, da außer mir ja sowieso keiner mit dieser Abfrage etwas anfangen kann - undich dachte auch nicht, dass hier noch mal jemand reinschreibt.

Das man Joins klammern kann, war mir bis eben gar nicht bewusst. Ich gucke mir das morgen glatt noch mal an.

Ich musste mittlerweile auch feststellen, dass diese Abfrage nur funktioniert, wenn eine Postgres DB im Hintergrund arbeitet. Mit einer MSSQL DB kriege ich kein Ergebnis.

Es besteht also definitiv noch Verbesserungsbedarf. Das mit dem Union habe ich mir bisher allerdings auch noch nicht angeguckt.
 
Man muss nicht zwangsläufig die ganze Struktur kennen um offensichtliche Fehler zu entdecken.
Schau dir das mal an, bei Fragen gerne hier melden. ;)
 
Zurück
Oben