2016-10-28 3 views
2

Ich habe die folgenden drei Tabellen, die ich versuche zusammenzufügen und einen Überblick über alle Desktops zu erstellen, und wer auch immer einen ihrer UserID zugewiesen hat.Welche Art von JOIN sollte ich verwenden, um diese Tabellen zu verbinden?

dbo.Users 
ID Name  Lastname JobTitle 
118 Ryan  Doe  Field Engineer 
119 Jessica Braun  Technical Consultant 
120 Daniel Sous  Web developer 
121 Amy  Amyson  Intern 
.. etc 

dbo.LightDesktops 
ID Model  MACAddress   UserID 
1  HP1234 AA:AA:AA:AA:AA:AA 118 
2  HP1234 BB:BB:BB:BB:BB:BB 121 
3  HP1234 AA:BB:BB:AA:BB:AA NULL 
4  HP1234 BB:AA:BB:AA:AA:BB 124 

dbo.MediumDesktops 
ID Model  MACAddress   UserID 
1 HP12PRO AA:AB:AA:BB:AA:BA 132 
2 HP12PRO BB:BA:AB:BA:BB:AA 119 
3 HP12PRO AA:BA:BA:AB:AA:BA 123 
4 HP12PRO BB:BB:BB:AB:BA:BB 241 

ich es geschafft, herauszufinden, wie es von Desktop, zum Beispiel LightDesktops pro Art zu tun:

SELECT * FROM LightDesktops LEFT OUTER JOIN Users ON LightDesktops.UserID = Users.UserID 

Das wird mir zeigen einen schönen Überblick über die Licht Desktops mit ihren Informationen sowie wer hat einem zugewiesen, falls vorhanden.

Wenn ich einen Überblick über die Licht Desktops haben möchten, die nicht verwendet werden und deshalb auf Lager kann ich

SELECT * FROM LightDesktops LEFT OUTER JOIN Users ON LightDesktops.UserID = Users.UserID WHERE LightDesktops.UserID IS NULL 

tun Wie kann ich die gleichen Ergebnisse erreichen, aber für beide Tabellen mit Informationen von unsere Desktops? Ich habe versucht, eine UNION zu verwenden, habe aber viele doppelte Werte zurückgegeben.

+1

etwas off-topic; Haben Sie in Betracht gezogen, leichte und mittlere Desktops in einem Tisch zusammenzuführen? Sie könnten eine zusätzliche Spalte hinzufügen, um zu identifizieren, welche hell/mittel sind.Der Vorteil dieses Ansatzes ist, dass die Abfragen, die Sie schreiben müssen, vereinfacht werden. –

+0

Können Sie ein Beispiel hinzufügen, welche Spalten Sie in der Ausgabe sehen möchten? –

+2

Der Ratschlag von @ destination-data kann gut sein, aber Sie haben möglicherweise keinen Zugriff auf diese Änderung. Alternativ können Sie 'CREATE VIEW' verwenden, um die Verknüpfungslogik an einer Stelle abzurufen und anschließend die Ansicht in allen nachfolgenden Abfragen zu verwenden. Zu einem späteren Zeitpunkt können Sie die Ansicht möglicherweise umgestalten, um die Ansicht zu entfernen. –

Antwort

2

UNION Mit dem leichten und mittleren Desktops Tabellen zusammen als ein einzelner Datensatz, den Sie Duplikate geben sollte nicht zu bringen, es sei denn, die Tabellen doppelte Werte enthalten in Reihen alle accross Spalten in Ihren SELECT Klauseln und Sie verwenden UNION ALL. Wenn Sie wissen, dass Ihre Tabellen eindeutige Werte haben, verwenden Sie UNION ALL, um eine Leistungssteigerung zu erzielen.

Ich würde die beiden Tabellen in einem gemeinsamen Tabellenausdruck (CTE) kombiniert und dann mit einem LEFT OUTER JOIN zu Ihrer Benutzertabelle die resultierende Join-Tabelle, die auch Einträge gefiltert werden kann, zu finden, wo es keine Übereinstimmung WHERE [user].[UserID] IS NULL, NB ist, dass würde verwaiste Zeilen in Ihren Desktop-Tabellen zurückgeben, in denen der Benutzer gelöscht wurde; Alternativ können Sie den linken äußeren Join löschen und WHERE [desktop].[UserID] IS NULL verwenden, um nur Dekstops ohne zugeordnete Benutzer zurückzugeben.

Sie könnten den folgenden Code versuchen;

WITH cte_Desktop AS 
(
    SELECT 
     [ID] as [DesktopID], 
     'Light Desktop' as [DekstopType], 
     [Model], 
     [MACAddress], 
     [UserID] 
    FROM [dbo].[LightDesktops] 

    UNION 

    SELECT 
     [ID], 
     'Medium Desktop', 
     [Model], 
     [MACAddress], 
     [UserID] 
    FROM [dbo].[MediumDesktops] 
) 

SELECT 
    [desktop].* 

FROM cte_Desktop AS [desktop] 
LEFT OUTER JOIN [dbo].[Users] AS [user] 
    on [user].[UserID] = [desktop].[UserID] 

WHERE [user].[UserID] IS NULL 
1

Versuchen

WITH all as (
select model , userid from LightDesktops 
union 
select model , userid from MediumDesktops 
) 

select * FROM all where UserId IS NULL 
+0

Du hast recht, danke. –

1

Verwendung Full join vorliegenden Bericht aller Nutzer zu erhalten. es wird Ihnen den vollständigen Bericht geben. Am Anfang dieser Ergebnisse Abfrage für die Benutzer-ID ist NULL

SELECT U.ID userid, 
     U.NAME, 
     LD.USERID LD_USERID, 
     LD.MODEL LIGHT_MODEL, 
     LD.MACADDRESS LIGHT_MAC, 
     LM.USERID LM_USERID, 
     LM.MODEL MEDIUM_MODEL, 
     LM.MACADDRESS MEDIUM_MAC 
FROM #USERS U 
     FULL OUTER JOIN #LIGHTD LD 
     ON (U.ID = LD.USERID) 
     FULL OUTER JOIN #LIGHTM LM 
     ON (LM.USERID = U.ID) 
1

Während können Sie erreichen, was Sie in einer einzigen Abfrage benötigen, kann es erträglich sein, die Tabelle Vereinigung auszubrechen in eine Ansicht, die die Logik ermöglicht über mehrere Abfragen wiederverwendet werden und ermöglicht auch einfacher Refactoring an ein späteres Datum.

Nod zu destination-data für mich daran zu erinnern.

Ansicht

CREATE VIEW [dbo].[Desktops] AS 
(
    SELECT 
     [ID] as [DesktopID], 
     'Light Desktop' as [DekstopType], 
     [Model], 
     [MACAddress], 
     [UserID] 
    FROM [dbo].[LightDesktops] 

    UNION 

    SELECT 
     [ID], 
     'Medium Desktop', 
     [Model], 
     [MACAddress], 
     [UserID] 
    FROM [dbo].[MediumDesktops] 
) 

Abfrage

SELECT 
    [desktop].* 

FROM [dbo].[Desktops] AS [desktop] 
LEFT OUTER JOIN [dbo].[Users] AS [user] 
    on [user].[UserID] = [desktop].[UserID] 

WHERE [user].[UserID] IS NULL 
Verwandte Themen