Solved

MS SQL update/insert query

Posted on 2009-04-05
7
202 Views
Last Modified: 2012-05-06
Hello experts, Im newbie to MS SQL. I have two tables both hold the same fields Time, computer name, MAC, IP and Status which can be either logon or logoff. Table1 is populated by a logon script and Table2 should read and maintain from table1 only the first and last time a user logged on\off to any workstation.  
 I have written the following query which update only the last time a user logged on and off. I would like to refine it so it would also keep the first time a user logged on/off and insert a new record if username and computer name is not matching.  I set max pts as this is needed asap. Thanks

UPDATE Table2
   SET username = Table1.username
     , computer = Table1.computer
	 , status = Table1.status
	 , IP = Table1.IP
	 , MAC = Table1.MAC
	 , Time01 = Table1.time01
 FROM Logonoff2
 JOIN Table1
   ON Table2.username = logonoff_all.username 
	and Table12.computer = Table1.computer 
	and Table1.status = Table2.status
	and Table1.time01 > Table2.time01 
	
INSERT INTO Table2 (Username, Computer, Status, IP, time01)
  SELECT Table1.username, Table1.computer, Table1.status
	, Table1.IP, Table1.time01
  FROM Table1
 WHERE NOT EXISTS ( SELECT null FROM Table1
WHERE         Table2.userName = Table2.username 
	and computer.Table2 = Table1.computer)

Open in new window

0
Comment
Question by:HAKSA
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 2
7 Comments
 
LVL 42

Expert Comment

by:pcelba
ID: 24070946
It should be much easier to have two Time columns in Table2:
SELECT username, computer, IP, MAC, status, MIN(Time01) FirstTime, MAX(Time01) LastTime
  INTO Table2
  FROM Table1
 GROUP BY username, computer, IP, MAC, status

Open in new window

0
 
LVL 42

Expert Comment

by:pcelba
ID: 24071004
If you need just one pair of time values independently on status, then you may remove status column from above select. If the status is important then you may use following:
SELECT t1.username, t1.computer, t1.IP, t1.MAC, 
       t1.FirstTime, t1min.Status FirstStatus, t1.LastTime, t1max.Status LastStatus
  FROM (SELECT username, computer, IP, MAC, MIN(Time01) FirstTime, MAX(Time01) LastTime
          FROM Table1
         GROUP BY username, computer, IP, MAC) t1
  INNER JOIN Table1 t1min ON t1min.username = t1.username AND t1min.MAC = t1.MAC AND t1min.Time01 = t1.FirstTime
  INNER JOIN Table1 t1max ON t1max.username = t1.username AND t1max.MAC = t1.MAC AND t1max.Time01 = t1.LastTime

Open in new window

0
 

Author Comment

by:HAKSA
ID: 24075636
Hi pcelba,
thanks for your reply. I agree with you having 2 time columns in t2 made it much easier but I still have one small problem. Considering that t1 is a transition table and it will be cleaned up or regular bases,  How can I maintain the min (time) in t2 even after the original record is deleted in t1.
UPDATE T_2
   SET username = T_1.username
     , computer = T_1.computer
	 , status	= T_1.status
	 , IP = T_1.IP
	 , MAC= T_1.MAC
	 , Firsttime= (select min(Time01) from T_1)
	 , Lasttime = (select max(time01) from T_1)
 FROM T_2
 JOIN T_1
   ON T_2.username = T_1.username 
	and T_1.computer = T_1.computer 
	and T_1.status = T_2.status

Open in new window

0
Free learning courses: Active Directory Deep Dive

Get a firm grasp on your IT environment when you learn Active Directory best practices with Veeam! Watch all, or choose any amount, of this three-part webinar series to improve your skills. From the basics to virtualization and backup, we got you covered.

 
LVL 42

Expert Comment

by:pcelba
ID: 24075746
OK, this means you cannot create T_2 by one SELECT command but you have to go back to Insert/Update scenario. Then it should be sufficient to update just max time because the min time cannot change once calculated. It, of course, depends on the way how data are stored in T_1.
0
 
LVL 42

Accepted Solution

by:
pcelba earned 500 total points
ID: 24075922
Let suppose the unique key in T_2 table is username + computer + status (I would prefer username + MAC + status but it does not matter).

You have to group records from T_1 always to avoid duplicities in T_2. And we may suppose both min and max time may change:

SELECT username, computer, IP, MAC, status, MIN(Time01) FirstTime, MAX(Time01) LastTime
  INTO #TempTime
  FROM T_1
 GROUP BY username, computer, IP, MAC, status 
 
UPDATE T_2
   SET Firsttime = CASE WHEN T_2.FirstTime < #TempTime.FirstTime THEN T_2.FirstTime ELSE #TempTime.FirstTime END,
       Lasttime  = CASE WHEN T_2.LastTime > #TempTime.LastTime THEN T_2.LastTime ELSE #TempTime.LastTime END
 FROM T_2
 JOIN #TempTime 
   ON T_2.username = #TempTime.username 
	and T_2.computer = #TempTime.computer 
	and T_2.status = #TempTime.status
 
INSERT INTO T_2
SELECT username, computer, IP, MAC, status, FirstTime, LastTime
  FROM #TempTime
 WHERE NOT EXIST 
   (SELECT null FROM T_2 
     WHERE username = #TempTime.username 
       AND computer = #TempTime.computer
       AND status = #TempTime.status)
 
DROP TABLE #TempTime

Open in new window

0
 
LVL 42

Expert Comment

by:pcelba
ID: 24075941
WHERE NOT EXISTS   of course

Other possible solution exist, as well.
0
 

Author Closing Comment

by:HAKSA
ID: 31566723
It works just like i want it. Thanks
0

Featured Post

Online Training Solution

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action. Forget about retraining and skyrocket knowledge retention rates.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Two tables - Sum of values - What is the difference 31 59
SQL Server 2012 express 24 45
Table create permissions on SQL Server 2005 9 45
Help  needed 3 54
This article will describe one method to parse a delimited string into a table of data.   Why would I do that you ask?  Let's say that you need to pass multiple parameters into a stored procedure to search for.  For our sake, we'll say that we wa…
I've encountered valid database schemas that do not have a primary key.  For example, I use LogParser from Microsoft to push IIS logs into a SQL database table for processing and analysis.  However, occasionally due to user error or a scheduled task…
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…
How to Install VMware Tools in Red Hat Enterprise Linux 6.4 (RHEL 6.4) Step-by-Step Tutorial

759 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question