Quel genre de JOIN devrais-je utiliser pour join ces tables?

J'ai les trois tables suivantes que j'essaye de joindre set et de créer une vue d'set de tous les bureaux et de ceux qui en ont assigné un à leur ID user s'il y en a.

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 

J'ai réussi à comprendre comment le faire par type de bureau, par exemple LightDesktops:

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

Cela me montrera un bon aperçu des ordinateurs de bureau légers avec leurs informations ainsi que celui qui en a affecté un à la place.

Si je voudrais avoir un aperçu des ordinateurs de bureau légers qui ne sont pas utilisés et donc en stock je peux faire

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

Comment puis-je get les mêmes résultats, mais pour les deux tables contenant des informations sur nos bureaux? J'ai essayé d'utiliser UNION mais m'a renvoyé beaucoup de valeurs en double.

L'utilisation de UNION pour rassembler les tables de bureaux légers et moyens sous la forme d'un seul set de données ne devrait pas vous donner de duplicates sauf si les tables contiennent des valeurs en double dans les lignes de toutes les colonnes de vos clauses SELECT et que vous utilisez UNION ALL . Si vous savez que vos tables ont des valeurs uniques, utilisez UNION ALL pour augmenter les performances.

Je combinerais les deux tables dans une expression de table commune (cte) et ensuite joindrais la table résultante avec un LEFT OUTER JOIN à votre table d'user qui peut également être filtrée pour find des inputs où il n'y a aucune correspondance WHERE [user].[UserID] IS NULL , NB, qui returnnerait des lignes orphelines dans vos tables de bureaux où l'user a été supprimé; Sinon, supprimez la jointure externe gauche et utilisez WHERE [desktop].[UserID] IS NULL pour renvoyer uniquement deskstops sans users associés.

Vous pouvez essayer le code suivant;

 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 

Utilisez Full join pour get le rapport de tous les users présents. il vous donnera le rapport complet. En plus de ce résultat, la requête pour l'ID user est 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) 

Alors que vous pouvez get ce dont vous avez besoin dans une seule requête, il peut être plus supportable de décomposer la table en une vue qui permet à cette logique d'être réutilisée sur plusieurs requêtes et qui permet également une refacturation plus facile à une date ultérieure.

Nod à destination-données pour me callbacker de cela.

Vue

 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] ) 

Question

 SELECT [desktop].* FROM [dbo].[Desktops] AS [desktop] LEFT OUTER JOIN [dbo].[Users] AS [user] on [user].[UserID] = [desktop].[UserID] WHERE [user].[UserID] IS NULL 

Essayer

 WITH all as ( select model , userid from LightDesktops union select model , userid from MediumDesktops ) select * FROM all where UserId IS NULL