2009-06-15 14 views
0

J'essaie de créer une requête SQL 2005 pour récupérer et combiner des enregistrements de 3 vues de données SCCM. La première vue contient des enregistrements de PC valides; la seconde contient des informations de connexion contenant: ID-PC, nom d'utilisateur, horodatage, etc; le troisième contient PC-id, adresse IP.Requête SCCM: Comment obtenir le dernier enregistrement de connexion utilisateur (le cas échéant) et affichage PC, IP, utilisateur, logontimestamp

La 1stview ne contient qu'un seul enregistrement nique par PC; la deuxième vue peut contenir plusieurs enregistrements par ordinateur: un pour chaque connexion d'un utilisateur à un ordinateur; le 3ème peut contenir plusieurs enregistrements par PC: un pour chaque adresse IP enregistrée dans la base de données.

il est comme:

view1 (v_R_System_Valid) fields (among others) 
ResourceID, NetBIOS 

view2 (v_GS_SYSTEM_CONSOLE_USER) fields (among others) 
id,ResourceID,SystemConsoleUser0,LastConsoleUse0 

view3 (v_RA_System_IPAddresses) fields (among others) 
ResourceID,IP_Addresses0 

Je veux que la requête de me présenter une liste de tous les PC dans la première vue, et afficher également (est disponible) l'adresse IP; le moment le plus tard, une connexion s'est produite et par qui.

La requête que j'ai construite sofar renvoie chaque PC, mais inclut CHAQUE utilisateur qui s'est connecté à ce PC et quand, pas le dernier seulement. J'espère que n'importe qui peut m'aider à comprendre cela. Je ne suis pas un scripteur SQL expérimenté et construit le code ci-dessous en utilisant l'info du Net.

Ma requête:

Select 
SV.Netbios_Name0 AS [NetBIOS Name], 
SCU.SystemConsoleUser0 AS [User Name], 
CAST(ISNULL(SCU.theLastTime, 0) AS datetime) AS [Last Console Use] 

from v_R_System_Valid SV 
Left Join (Select ResourceID, SystemConsoleUser0, 
       Max(LastConsoleUse0) as theLastTime 
      from v_GS_SYSTEM_CONSOLE_USER 
      group by ResourceID, SystemConsoleUser0) 
    AS SCU on SCU.ResourceID = SV.ResourceID 

where (SV.Netbios_Name0 not like 'ENC-%') 
and (SV.Netbios_Name0 not like 'NL%') 

order by SV.Netbios_Name0 

Merci à l'avance, Eric

+0

merci pour le reformatage! – bernie

Répondre

1
SELECT SV.Netbios_Name0 AS [NetBIOS Name]  
     , latest_user.SystemConsoleUser0 as [User Name] 
     , CAST(ISNULL(SCU.theLastTime, 0) AS datetime) AS [Last Console Use] 
     , IP.IP_Addresses0 
from v_R_System_Valid SV 
     left outer join 
       (Select ResourceID 
          ,Max(LastConsoleUse0) as theLastTime 
       from  v_GS_SYSTEM_CONSOLE_USER 
       group by ResourceID 
          ,SystemConsoleUser0) AS SCU 
     on SCU.ResourceID = SV.ResourceID 

     left outer join v_GS_SYSTEM_CONSOLE_USER as latest_user 
     on latest_user.LastConsoleUse0 = SCU.theLastTime 
    and 
     latest_user.ResourceID = SCU.ResourceID 
     left outer join v_RA_System_IPAddresses as IP 
     on IP.ResourceID = SV.ResourceID 
where (SV.Netbios_Name0 not like 'ENC-%') 
    and 
     (SV.Netbios_Name0 not like 'NL%') 
order by SV.Netbios_Name0 
+0

Salut Adam. Merci beaucoup pour cette belle façon de combiner plusieurs jointures. Je ne le savais pas. Vous avez fait une faute de frappe 'latestuser.resourceID' au lieu de 'latest_user.resourceID', et j'ai supprimé SystemConsoleUser0 de la clause Group by pour obtenir uniquement le dernier enregistrement d'ouverture de session d'utilisateur. Ajout d'un autre ET dans la jointure avec v_RA_System_IPAddresses pour obtenir uniquement les adresses IP commençant par '10.% '. Je n'aurais pas pu le faire sans votre aide. Merci. – evegter

+0

Beau travail evegter! Oui, j'ai eu deux grosses fautes de frappe. C'est bon pour vous de les renifler et de faire en sorte que la chose fonctionne pour vos objectifs. – bernie

0

Avec l'aide d'Adam, je suis venu à cette requête résultante:

select SV.Netbios_Name0 AS [NetBIOS Name] 
    , latest_user.SystemConsoleUser0 as [User Name] 
    , CAST(ISNULL(SCU.theLastTime, 0) AS datetime) AS [Last Console Use] 
    , IP.IP_Addresses0 
from v_R_System_Valid SV 
    left outer join 
     (Select ResourceID 
      ,Max(LastConsoleUse0) as theLastTime 
     from v_GS_SYSTEM_CONSOLE_USER 
     group by ResourceID) AS SCU 
     on SCU.ResourceID = SV.ResourceID 
    left outer join v_GS_SYSTEM_CONSOLE_USER as latest_user 
     on latest_user.LastConsoleUse0 = SCU.theLastTime 
      and 
      latest_user.ResourceID = SCU.ResourceID 
    left outer join v_RA_System_IPAddresses as IP 
     on IP.ResourceID = SV.ResourceID where (SV.Netbios_Name0 not like 'ENC-%') 
      and 
      (SV.Netbios_Name0 not like 'NL%') 
      and 
      (IP.IP_Addresses0 like '10.%') 
     order by SV.Netbios_Name0 
Questions connexes