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
Solved

Update values based on multy line compare without using a loop

Posted on 2011-03-16
14
322 Views
Last Modified: 2012-05-11
Hi,
I need to compare two tables, one is my reference table with names of "places" broken into words and the other one is address also broken into words.
in the reference table I keep a placeCode which I would like to update into the addressesTable.
I've been playing around with it for some time and I can't get it right...
there are a few problems :
when breaking a place name to words we get values that appear in more then one place entry like the word "New" which is part of New York as well as New Hampshire.
similarly there are values which are a part of another value such as "Hempshire"  and "New Hempshire". (can it be done using a few updates from the longer values to the shorter ones ?)
I would like to update only the rows that actually match and not the whole Address (ID)

please any ideas will be apreciated.

attached is a sample code that builds three tables and populates them, one table is the refrence table (dictionary) and the other two are the input data, one just as I get it and the other as I need it after the update.
I would like to avoid update in a loop...

/* table creation */
CREATE TABLE placesdictionary (
  PlaceID int,
  PlaceWordNum int,
  PlaceWord varchar(50) ,
  PlaceCode int
) ;

CREATE TABLE testdata_after (
  ID int,
  WordNum int,
  Word varchar(50) ,
  PlaceCode int
) ;

CREATE TABLE testdata_b4 (
  ID int,
  WordNum int,
  Word varchar(50) ,
  PlaceCode int
) ;

/* populate dictionary */
INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (1, 1, 'New', 7878)

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (1, 2, 'York', 7878)

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (2, 1, 'New', 8888)

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (2, 2, 'Hampshire', 8888)

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (3, 1, 'South', 9999)

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (3, 2, 'Carolina', 9999)

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (4, 1, 'South', 2323)

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (4, 2, 'Dakota', 2323)

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (5, 1, 'Camp', 8765);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (5, 2, 'Verde', 8765);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (6, 1, 'Camp', 5656);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (6, 2, 'Davis', 5656);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (7, 1, 'Jericho', 4444);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (8, 1, 'Hempshire', 6666);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (9, 1, 'Camp', 8765);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (9, 2, 'Verd', 8765);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (10, 1, 'Yericho', 4444);

/* populate b4 table */
INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 1, 56);

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 2, 'Arlington');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 3, 'rd.');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 4, 'New');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 5, 'York');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 1, 44);

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 2, 'Main');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 3, 'st.');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 4, 'New');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 5, 'Hempshire');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (3, 1, 5);

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (3, 2, 'Main');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (3, 3, 'st.');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (3, 4, 'Hempshire');

/* populate after table */
INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (1, 1, 56);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (1, 2, 'Arlington');

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (1, 3, 'rd.');

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (1, 4, 'New', 7878);

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (1, 5, 'York', 7878);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (2, 1, 44);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (2, 2, 'Main');

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (2, 3, 'st.');

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (2, 4, 'New', 8888);

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (2, 5, 'Hempshire', 8888);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (3, 1, 5);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (3, 2, 'Main');

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (3, 3, 'st.');

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (3, 4, 'Hempshire', 6666);
0
Comment
Question by:syoffe
  • 6
  • 5
  • 2
  • +1
14 Comments
 
LVL 7

Expert Comment

by:mkobrin
ID: 35154328
This should do it for you
select b4.ID, b4.WordNum, b4.word, d.placecode
from testdata_b4 b4
left outer join placesdictionary d on d.PlaceWord = b4.word and d.PlaceID  = b4.ID
order by b4.ID, b4.WordNum

Open in new window

0
 

Author Comment

by:syoffe
ID: 35154699
thnx for the suggestion,
but no this does not help me as what I need is a little more complicated.
see the testdata_after and compare it to the result of the select you sent... similar but not same :)
0
 

Author Comment

by:syoffe
ID: 35154714
I must not take Place codes for half a place, like I cannot take the code for "New Hempshire" 8888 for the word New without it being followed by the word Hempshire
0
Three Reasons Why Backup is Strategic

Backup is strategic to your business because your data is strategic to your business. Without backup, your business will fail. This white paper explains why it is vital for you to design and immediately execute a backup strategy to protect 100 percent of your data.

 

Author Comment

by:syoffe
ID: 35154775
Sorry I made some spelling mistakes in my testdata here it is corrected :

drop table placesdictionary;
drop table testdata_after;
drop table testdata_b4;
/* table creation */
CREATE TABLE placesdictionary (
  PlaceID int,
  PlaceWordNum int,
  PlaceWord varchar(50) ,
  PlaceCode int
) ;

CREATE TABLE testdata_after (
  ID int,
  WordNum int,
  Word varchar(50) ,
  PlaceCode int
) ;

CREATE TABLE testdata_b4 (
  ID int,
  WordNum int,
  Word varchar(50) ,
  PlaceCode int
) ;

/* populate dictionary */
INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (1, 1, 'New', 7878);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (1, 2, 'York', 7878);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (2, 1, 'New', 8888);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (2, 2, 'Hampshire', 8888);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (3, 1, 'South', 9999);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (3, 2, 'Carolina', 9999);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (4, 1, 'South', 2323);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (4, 2, 'Dakota', 2323);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (5, 1, 'Camp', 8765);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (5, 2, 'Verde', 8765);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (6, 1, 'Camp', 5656);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (6, 2, 'Davis', 5656);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (7, 1, 'Jericho', 4444);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (8, 1, 'Hempshire', 6666);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (9, 1, 'Camp', 8765);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (9, 2, 'Verd', 8765);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (10, 1, 'Yericho', 4444);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (11, 1, 'New', 8888);

INSERT INTO PlacesDictionary
(PlaceID, PlaceWordNum, PlaceWord, PlaceCode)
VALUES (11, 2, 'Hempshire', 8888);

/* populate b4 table */
INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 1, 56);

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 2, 'Arlington');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 3, 'rd.');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 4, 'New');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (1, 5, 'York');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 1, 44);

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 2, 'Main');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 3, 'st.');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 4, 'New');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (2, 5, 'Hempshire');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (3, 1, 5);

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (3, 2, 'Main');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (3, 3, 'st.');

INSERT INTO tests.testdata_b4
(ID, WordNum, Word)
VALUES (3, 4, 'Hempshire');

/* populate after table */
INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (1, 1, 56);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (1, 2, 'Arlington');

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (1, 3, 'rd.');

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (1, 4, 'New', 7878);

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (1, 5, 'York', 7878);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (2, 1, 44);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (2, 2, 'Main');

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (2, 3, 'st.');

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (2, 4, 'New', 8888);

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (2, 5, 'Hempshire', 8888);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (3, 1, 5);

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (3, 2, 'Main');

INSERT INTO tests.testdata_after
(ID, WordNum, Word)
VALUES (3, 3, 'st.');

INSERT INTO tests.testdata_after
(ID, WordNum, Word, PlaceCode)
VALUES (3, 4, 'Hempshire', 6666);
0
 

Author Comment

by:syoffe
ID: 35154809
and there is nothing between PlaceID and testdata_b4.ID I cannot use this column for the join...
0
 
LVL 11

Expert Comment

by:JoeNuvo
ID: 35156052
is there a limit for number of WordNum under dictionary?
from given example is 2, but is there any thing greater?
0
 
LVL 11

Expert Comment

by:JoeNuvo
ID: 35156662
and, will it have more than 1 word able to found from dictionary in 1 address?
just for ex, may found "New York" and "New Hempshire" in same ID of testdata
0
 
LVL 9

Expert Comment

by:rajeevnandanmishra
ID: 35156857
Hi,

I am not considering the optimization. But in the given constraint. If you already have data in your testdata_after table then run the below code:
 
update P 
set PlaceCode = Q.PlaceCode 
from 
testdata_after P, 
(select x.id, y.PlaceCode from 
(select a.id, a.Word + ISNULL(b.Word,'') Word From 
(select id, wordNum, Word from testdata_b4 where WordNum = 4) a left outer join 
(select id, wordNum, Word from testdata_b4 where WordNum = 5) b on a.id = b.id ) x , 
(select a.PlaceCode, a.PlaceWord + ISNULL(b.PlaceWord,'') PlaceWord From 
(select PlaceCode, PlaceWord from placesdictionary where PlaceWordNum = 1) a left outer join 
(select PlaceCode, PlaceWord from placesdictionary where PlaceWordNum = 2) b on a.PlaceCode = b.PlaceCode) y 
 where x.Word = y.PlaceWord) Q 
where P.ID = Q.ID 
and P.WordNum in (4,5)

Open in new window


If you are creating the data by using the select query then please use:
 
INSERT INTO testdata_after 
SELECT P.ID, P.WordNum, P.Word, case when P.WordNum in (4,5) then Q.PlaceCode else null end PlaceCode 
from 
testdata_b4 P LEFT OUTER JOIN  
(select distinct x.id, y.PlaceCode from 
(select a.id, a.Word + ISNULL(b.Word,'') Word From 
(select id, wordNum, Word from testdata_b4 where WordNum = 4) a left outer join 
(select id, wordNum, Word from testdata_b4 where WordNum = 5) b on a.id = b.id ) x , 
(select a.PlaceCode, a.PlaceWord + ISNULL(b.PlaceWord,'') PlaceWord From 
(select PlaceCode, PlaceWord from placesdictionary where PlaceWordNum = 1) a left outer join 
(select PlaceCode, PlaceWord from placesdictionary where PlaceWordNum = 2) b on a.PlaceCode = b.PlaceCode) y 
 where x.Word = y.PlaceWord) Q 
ON P.ID = Q.ID

Open in new window

0
 
LVL 9

Expert Comment

by:rajeevnandanmishra
ID: 35156878
I have considered an assumption that the Address that need the matching will always be with WordNum 4 or 5.
0
 
LVL 11

Accepted Solution

by:
JoeNuvo earned 500 total points
ID: 35160675
this is my very triggy code.
not sure how well it will perform.
you have to give it a try and feedback

-- Reduce the size of dictionary, to reduce the size of recursive CTE
Declare @PDic TABLE (
  PlaceID int,
  PlaceWordNum int,
  PlaceWord varchar(50) ,
  PlaceCode int,
  WordCnt int
)
INSERT INTO @PDic
	SELECT *, 0 FROM PlacesDictionary
	WHERE PlaceID IN (
		SELECT PlaceID 
		FROM PlacesDictionary PD 
			INNER JOIN testdata_b4 T ON PD.PlaceWord = T.Word
		)
-- update size of complete word
UPDATE @PDic
SET WordCnt = CNT
FROM (SELECT PlaceID, COUNT(*) CNT FROM @PDic GROUP BY PlaceID) PCnt, @PDic PD
WHERE PCnt.PlaceID = PD.PlaceID

-- define max recursive loop
Declare @max int
SELECT @max = MAX(wordnum) FROM testdata_b4

-- recursive to create matching table for all WordNum position
Declare @Match TABLE (ID int, WordNum int, PlaceCode int, PlaceID int, PlaceRound int, WordCnt int)
;WITH CTE as (
	SELECT PlaceID, PlaceWordNum, PlaceWord, PlaceCode, WordCnt, 1 As PlaceRound FROM @PDic
	UNION ALL
	SELECT PlaceID, PlaceWordNum + 1, PlaceWord, PlaceCode, WordCnt, PlaceRound + 1
	FROM CTE WHERE PlaceRound < @max
)
INSERT INTO @Match
SELECT ID, WordNum, CTE.PlaceCode, PlaceID, PlaceRound, Wordcnt
FROM testdata_b4 t
	INNER JOIN CTE on t.WordNum = CTE.PlaceWordNum AND t.Word = CTE.PlaceWord

-- delete incomplete word
DELETE M
FROM @Match M INNER JOIN (
	SELECT ID, PlaceID, PlaceCode, PlaceRound, COUNT(*) cnt
	FROM @Match
	GROUP BY ID, PlaceID, PlaceCode, PlaceRound
) Filter ON M.ID = Filter.ID AND M.PlaceID = Filter.PlaceID 
AND M.PlaceRound = Filter.PlaceRound
AND M.WordCnt <> Filter.cnt

-- delete overlap word, by delete the shorter one
;WITH CTE AS(
	SELECT ID, PlaceID, PlaceRound, WordCnt, MIN(WordNum) mn, MAX(WordNum) mx
	FROM @Match
	GROUP BY ID, PlaceID, PlaceRound, WordCnt
)
DELETE M
FROM @Match M INNER JOIN (
	SELECT A.ID, A.PlaceID, A.PlaceRound
	FROM CTE A INNER JOIN CTE B
	ON A.ID = B.ID AND A.mn <= B.mx AND A.mx >= B.mn AND A.WordCnt < B.WordCnt
) Filter ON M.ID = Filter.ID AND M.PlaceID = Filter.PlaceID AND M.PlaceRound = Filter.PlaceRound

-- update PlaceCode with matching data
UPDATE testdata_b4
SET PlaceCode = M.PlaceCode
FROM @Match M
WHERE testdata_b4.ID = M.ID AND testdata_b4.WordNum = M.WordNum

-- get result
SELECT *
FROM testdata_b4
ORDER BY ID, WordNum

Open in new window

0
 
LVL 11

Expert Comment

by:JoeNuvo
ID: 35161009
Bug: let say got these word in dictionary "Arlington rd." (8) , "rd. New" (7), "New York" (7878)
for testdata ID 1  will output as
1	1	56		NULL
1	2	Arlington	8	-- first found have complete data
1	3	rd.		8
1	4	New		7	-- bug
1	5	York		7878	-- bug

Open in new window


patch: replace line 59 with below code
	ON A.ID = B.ID AND A.mn <= B.mx AND A.mx >= B.mn
		AND (A.WordCnt < B.WordCnt OR (A.WordCnt = B.WordCnt AND A.PlaceID < B.PlaceID))

Open in new window

0
 

Author Comment

by:syoffe
ID: 35174315
Thank you for your solutions and apologies for my delayed response,
JoeNuvo, there is no limit to the number of rows comprising the value, 2 is just an example, it can be greater  then 2 and it can also be 1, we should prefer longer values. as for more then one value per address we can safely assume there will be only one value per address.
Rajeevnandanmishra, we cannot use the after table as our input, it is there just to illustrate what the data should look like after the update, and we cannot also assume the location of the "place" in the address...
also notice the content of the "after" table, it does not match the insert SQL you suggested.
JoeNuvo, looks very interesting, I'll test and post my comment.

thank you all
0
 

Author Comment

by:syoffe
ID: 35174937
Hi JoeNuvo,
it seems to be working like magic :) thank you
my problem now is that I have to actually understand the CTE part of it in order to adopt it to the real scenario in order to check performance :(

thnx again
0
 
LVL 11

Expert Comment

by:JoeNuvo
ID: 35174951
for the first CTE
let say for "New York", this word got PlaceWordNum 1,2
In order to compare with all position from test table, let say having 5 words long, at least we need to have "New York" for 1,2 : 2,3 : 3,4 : 4,5
so, the CTE will try to generate those list, using RECURSIVE

Round	Word	Place
1	New	1
1	York	2
UNION ALL
	2	New	2
	2	York	3
	UNION ALL
		3	New	3
		3	York	4
			UNION ALL
			4	New	4
			4	York	5

Open in new window


the second CTE is just like sub query

;WITH CTE AS (SELECT Field1, Field2, Field3 FROM MyTable WHERE condition = 10)
SELECT ...
FROM CTE
      INNER JOIN ....

will be same as

SELECT ...
FROM (SELECT Field1, Field2, Field3 FROM MyTable WHERE condition = 10) CTE
      INNER JOIN ....
0

Featured Post

NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
How do I subtract date and time within a same column in SQL 4 41
Access 2003 query lost it's only join 7 32
sql help 2 45
Stored Proc - Rewrite 42 55
by Mark Wills Attending one of Rob Farley's seminars the other day, I heard the phrase "The Accidental DBA" and fell in love with it. It got me thinking about the plight of the newcomer to SQL Server...  So if you are the accidental DBA, or, simp…
In this article we will get to know that how can we recover deleted data if it happens accidently. We really can recover deleted rows if we know the time when data is deleted by using the transaction log.
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…

790 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